Curt,

Thank you so much for your explanation.
I'll try to fix my code.  Thanks again.

--kiyoshi


On Sun, Mar 9, 2008 at 3:15 AM, Curt Arnold <[EMAIL PROTECTED]> wrote:
>
>  On Mar 4, 2008, at 1:57 PM, Kiyoshi Mizumaru wrote:
>
>  > I'm trying to narrowing down my problem and find that the following
>  > code
>  > crashes with signal 11, but eliminating the `//' on the sixth line
>  > make it run
>  > without any problem.  Could anyone please give me a clue?
>  >
>  > --kiyoshi
>  >
>  >
>  > #include <log4cxx/logger.h>
>  > #include <log4cxx/basicconfigurator.h>
>  > #include <log4cxx/propertyconfigurator.h>
>  > #include <iostream>
>  >
>  > // static log4cxx::LoggerPtr s_message =
>  > log4cxx::Logger::getLogger("root");
>  >
>  > class baz {
>  > public:
>  >    ~baz() {
>  >        std::cout << "baz::~baz()" << std::endl;
>  >        LOG4CXX_FATAL(log4cxx::Logger::getLogger("root"), "~baz()");
>  >    }
>  > } s_baz;
>  >
>  > int main(int, char**) {
>  >    log4cxx::BasicConfigurator::configure();
>  >    return EXIT_SUCCESS;
>  > }
>  >
>
>
>  You are getting bit by destruction order of static objects.  The first
>  log4cxx call will create a local static member that initializes APR.
>  On program end, static objects are then destroyed in the reverse order
>  of creation.  As the program stands, the sequence is:
>
>  baz::baz()
>  enter main
>  log4cxx::BasicConfigurator::configure() -> triggers APR initialization
>  exit main
>  APR termination
>  baz::~baz() -> calls log4cxx but APR has been terminated
>
>  If you uncomment the line, then:
>
>  s_message construction -> triggers APR initialization
>  baz::baz()
>  enter main
>  log4cxx::BasicConfigurator::configure()
>  exit main
>  baz::~baz()
>  APR termination
>
>  Anytime you perform logging in the destructor of a static object, you
>  need to ensure that log4cxx is initialized in or before the initial
>  construction of the static object.
>

Reply via email to