Re: VS2008 destroys static objects before global (non-static) objects?
Boris wrote:
On Wed, 22 Oct 2008 16:38:29 +0200, Ben Voigt [C++ MVP]
<rbv@nospam.nospam> wrote:
[...]
Well, you're missing the definition of
memory_manager<small_object>::p_
I left out a couple of more things - that's why I called it
pseudocode. :)
It has global lifetime (although private visibility). So you have
some difficulty controlling the construction and destruction order,
yes.
Are there any VC++ directives or compiler/linker switches to make
sure all static objects are destroyed last? I guess the pseudocode
It's not a static object. It's a global object stored in a static
variable.
See, the line in the header file which creates the variable doesn't
create
the object, you need a separate line at global scope in an
implementation file to create the object.
Ok, maybe I misunderstood and you are trying to tell me how I can fix
the problem. :) I still didn't understand completely what you are
trying to tell me but here's my shot:
----------
template <typename T>
class memory_manager
{
public:
void *operator new(std::size_t) { return p_->malloc(); }
void operator delete(void *p) { p_->free(p); }
private:
static pool *p_;
};
template <typename T> pool memory_manager<T>::p_ = new pool();
----------
Ok, isn't what I meant.
I meant in your main program:
extern __declspec(dllimport) template <> pool
memory_manager<small_object>::p_;
and in a DLL:
__declspec(dllexport) template <> pool memory_manager<small_object>::p_;
and undo making p_ a pointer. Now the DLL will be loaded before any main
program variables are constructed, so p_ will already be constructed. And
the DLL will be unloaded after all main program variables are destroyed, so
p_ is destroyed last.
Note that you *have* to explicitly instantiation each particular T.
Now the destructor of pool wouldn't be called anymore. But does it
help me? What happens with p_ when the DLL is unloaded? Can I rely on
the pointer to be valid when the last global small_object is
destroyed?
For now I'm still looking for a short-term solution; it's fine if it
works with VS2008 only and depends on another implementation detail.
And before someone asks: Simply building the code and testing it
would take a couple of hours. :)
Boris
[...]