静态成员破坏

我不是静态的粉丝,但我有一些代码:

除非别的东西在附近,否则静态破坏将会失败。 静态声明为DLL类中的成员。

可执行文件正在closures,因此运行时调用FreeLibary来释放启动时加载的DLL。

我知道在我的程序终止的时候,静态会被破坏(因为没有对施工顺序的保证,所以没有破坏命令的保证),但是什么时候会被破坏? 我的DLLMain (对于加载的DLL)退出后,或运行时__DllMainCRTStartup后,甚至在此之后?

我只想知道在破坏之前我是否有机会做一些事情,如果没有的话,我将需要考虑将静态移除到更合适的地方。

也许atexit函数将帮助你。 你给它一个回调函数,在进程分离期间由运行时执行。

DLL说明: http : //msdn.microsoft.com/en-us/library/988ye33t.aspx

atexit: http : //msdn.microsoft.com/en-us/library/tze57ck3.aspx

从你的问题我知道你在Windows上,并与微软编译器。 我的回答是特定于这个设置(虽然我很确定gcc是相似的)。

简短的回答是:
只要你的DLL在附近,而且它依赖于另外一个DLL,而你不用搞砸东西(比如你没有FreeLibrary的依赖),那么依赖DLL依然在内存中处于工作状态,并且可以叫做。 依赖DLL上的关机顺序只有在DLL完全关闭后才会启动。

使用Microsoft Visual Studio编译的DLL上的序列顺序:

  • DllMainCRTStartup是您的DLL的入口点。 你可以在这里看到这个方法的代码: c:\ program files \ Microsoft Visual Studio 11.0 \ VC \ CRT \ src \ crtdll.c
  • DllMainCRTStartup调用CRT_INIT(同一个文件)。
  • 在DLL_PROCESS_ATTACH中有各种初始化。 然后调用函数initterm 。 这个函数(在别处实现,见下文)是调用所有静态C ++对象的构造函数的函数。
  • 在DLL_PROCESS_DETACH中,CRT_INIT调用一堆破坏的onexit / atexit例程。
  • 调用CRT_INIT后,DllMainCRTStartup调用用户定义的DllMain。
  • terminit在crt0dat.c中实现。 它有一个指向数组的函数指针(由编译器和链接器生成),它们在循环中被调用。 每个函数都是静态对象的构造函数。

我认为另一种可能的解决方法是建立一个全局类,它的构造函数只需调用CoInitilize和析构函数调用CoUninitilize

然后确保这个全局是在包含一个ComPtr的对象之前创建的。 由于销毁将与构造相反,调用CoUninitilize的析构函数将在.Release上调用ComPtr之后发生。