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.
>