Boost logo

Boost :

From: Sean Huang (huangsean_at_[hidden])
Date: 2006-06-21 17:58:50


----- Original Message -----
From: "Gennadiy Rozental" <gennadiy.rozental_at_[hidden]>
>
> "Sean Huang" <huangsean_at_[hidden]> wrote in message
> news:BAY102-DAV1177B755E23C045FE1092BA3870_at_phx.gbl...
>> Here is the scenario:
>> A test case implemented as a class and the class uses
>> boost::serialization in the destructor to serialize some objects.
>> On windows, with both VC7.1 and VC8, I would get access violations and
>> runtime-error - pure virtual function call. Turned out it is because test
>> cases are not destroyed until the unit test framework singleton instance
>> goes away which happens only after the main returns.
>> boost::serialization
>> uses extensively function scope static objects and these objects are
>> instantiated during program termination in this particular case. There
>> are
>> some issues AFAICS:
>> 1. function-scope static objects deletion order
>> 2. At least with MSVC, atexit is called when a function-scope static
>> object
>> is created. It seems that the implementation does not support calling
>> atexit
>> when doexit is running. I took a quick glance at the standard but did not
>> find anything that mentions when atexit can be called.
>>
>> I was able to resolve the problem by forcing the deletion and recreation
>> of
>> the static unit test framework singleton object but I am not sure if
>> there
>> will be other consequences.
>
> Above information does not give me a clear picture of what is going on.
> Could you please post some example code, so I could comment more
> intelligently.
>
Here is an example:
#include <map>

#include <iostream>

#include <string>

class T

{

public:

T()

{

std::cout << "In T's constructor" << std::endl;

}

~T()

{

std::cout << "In T's destructor" << std::endl;

}

};

class Test

{

public:

void Func( void )

{

static T staticObj;

}

~Test()

{

Func();

}

};

static Test test;

int main(int argc, char* argv[])

{

return 0;

}

T's destructor will not be called. If there are too many static objects like
this (as in the case of boost::archive and boost::serialization), the
program crashes with access violations because the CRT tries to realloc the
function list used by atexit().

Hope this clarifies things a little.

Sean


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk