我有两个静态对象在两个不同的dlls中:
一个名为资源(Resources)的单例对象,和一个名为用户(User)的对象。在其析构函数中,对象User需要访问对象Resources。
我该如何确保对象Resources在对象User之前不被销毁?
我有两个静态对象在两个不同的dlls中:
一个名为资源(Resources)的单例对象,和一个名为用户(User)的对象。在其析构函数中,对象User需要访问对象Resources。
我该如何确保对象Resources在对象User之前不被销毁?
boost::shared_ptr my_resource_ptr ( new Resource() ); // new operator is important here!
然后您需要修改用户实现来存储其自己的shared_ptr:
class User
{
...
boost::share_ptr a_resource_ptr;
...
};
全局对象在其对应的DLL被卸载时被销毁。因此,由于您的“User”DLL可能依赖于您的“Resource”DLL,所以您会遇到麻烦:'resource'将始终在'user'之前被销毁。
如果存在一个好的答案,我也很感兴趣。直到现在,我使用了一个清理函数,在应用程序退出之前必须调用它,并且我只在析构函数中保留无害的代码。
我不认为你可以更改不同模块中全局变量的销毁顺序。 有没有可能添加一些引用计数?
如果您真的想要获取2个分离的Dlls,我可能有一些提示:您可以考虑使用Windows API中的FreeLibrary()
。根据msdn所述,FreeLibrary()
会为要卸载的Dll减少一个引用计数器,当计数器达到0时,该Dll将被卸载。
缺点:使用FreeLibrary()
意味着您正在使用LoadLibrary()
(msdn link)加载它,并且调用此库中的函数意味着您正在使用GetProcAddress()
函数,这可能导致非常丑陋的代码。而且,这也可能意味着您需要更改代码-获取指向Dll函数的全局变量以存储每个函数的地址...
如果您想要实现它:
你必须在进程的main()
函数中加载和释放库,也要在实现用户类的 DLL 中从 DllMain()
函数加载和释放库,当原因是 DLL_PROCESS_DETACH
时(参见 mdsn's DllMain link)。