如何强制不同dll中静态对象的销毁顺序?
-
22-08-2019 - |
题
我有2个 静止的 2 中的物体 不同的dll:
一个东西 资源 (这是一个单例)和一个对象 用户. 。对象用户在其析构函数中必须访问对象资源。
如何强制对象资源不在对象用户之前被破坏?
解决方案
当它们相应的DLL卸载全局对象被销毁。所以当你的“用户”的dll可能是依赖你的“资源” DLL的,你有麻烦了:“资源”总是会前“用户”摧毁
。我也有兴趣通过很好地回答了这个问题,如果一个存在。到现在为止,我使用的是清理功能必须由应用程序它退出之前被调用,而我只保留无害的代码析构函数。
其他提示
如果你能够把那个2个全局变量在同一个DLL它是不一样的故事。由于在自己的答复告诉正义与平等运动,DLL超脱为了不被系统保证。因此,你可能有一个很大的问题已经2个独立的DLL时。我不是Windows系统大师,但与谷歌一看,我发现MSDN博客谁告诉他们有同样的问题没有很好的解决方案,以解决这一问题。
我你可以把它们放在同一个DLL,根据我的解决方案更容易,在这种情况下,你并不需要(据我了解不可解)解决“不保证下,DLL超脱秩序”的问题。结果 但你仍然需要解决一个新的问题:全局变量破坏秩序不被C ++语言保证下,。但是这一个可以解决:
您需要使用某种参考couting的的。升压:: shared_ptr的可达到目的。
声明它全球并定义它的方式:
boost::shared_ptr my_resource_ptr ( new Resource() ); // new operator is important here!
然后,你需要修改你的用户实施商品其自身的shared_ptr:
class User
{
...
boost::share_ptr a_resource_ptr;
...
};
只要你的用户实例的全部一个不被破坏,那些将“保留”资源实例,因此防止被删除prematuraly,尽管全球shared_ptr的可能已被销毁。结果 最后User实例被破坏将(undirectly)删除资源实例。
无论您使用引用计数,ComPtr,你自己的,它应该做的伎俩。
我不认为你可以更改在不同的模块全局的破坏秩序。 加入一些引用计数的任何机会?
如果您确实想要获得 2 个独立的 Dll,我可能会给您一些提示:你可以考虑使用 FreeLibrary()
来自 Windows API。正如所述 msdn FreeLibrary()
减少 Dll 的引用计数器,当计数器达到 0 时,该 Dll 被卸载。
退税:使用 FreeLibrary()
意味着您正在加载它 LoadLibrary()
(msdn链接)并且从该库调用函数意味着您正在使用 GetProcAddress()
函数,这可能会导致非常丑陋的代码。它也可能意味着你的代码发生了一些变化 - 作为获取指向 Dll 函数的全局变量,以便存储每个函数的地址......
如果你想实现它:
- 您必须从您的计算机中加载并释放该库
main()
您的流程的功能, - 并从实现 User 类的 Dll 中加载和释放库。实施它在
DllMain()
该 Dll 的函数,当原因是DLL_PROCESS_DETACH
(看 mdsn的Dll主链接.
因此,只有在“用户”库完成后,它才会卸载“资源”库。
如果你愿意的话,请尝试一下,并告诉我它是否有效,因为我从未实施过它。
附:我对你的问题发布了第二个答案,以便在我(尝试)详细说明这两个答案时,在这两个答案之间进行有意义的区分。我不想让你把它们混淆起来并感到困惑......