gpt4 book ai didi

c++ - 如何在不同的 dll 中强制销毁静态对象的顺序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:53 24 4
gpt4 key购买 nike

我在 2 个不同的 dll 中有 2 个static 对象:

对象 Resources(这是一个单例)和对象 User。其析构函数中的对象用户必须访问对象资源。

如何强制对象资源不在对象用户之前被销毁?

最佳答案

如果您能够将这 2 个全局变量放在同一个 DLL 中,那就不是同一个故事了。正如 Jem 在自己的回复中所说,系统不保证 DLL 分离顺序。因此,当有 2 个分离的 Dll 时,您可能会遇到大问题。我不是 Windows 系统大师,但通过谷歌查看,我发现 msdn 博主告诉他们有同样的问题,但没有好的解决方案来解决它。

我可以将它们放在同一个 DLL 中,根据我的说法,解决方案更简单,在这种情况下,您不需要解决“不保证 DLL 分离顺序”的问题(据我所知无法解决) .
但是你还需要解决一个新问题:全局变量销毁顺序不受 c++ 语言的保证。但是这个问题可以解决:

你需要使用某种引用计算。 boost::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;
...
};

只要您的所有 User 实例都没有被销毁,它们就会“保留” Resource 实例,从而防止它被过早删除,即使全局 shared_ptr 可能已经被销毁。
最后一个被销毁的 User 实例将(间接地)删除 Resource 实例。

无论您使用什么引用计数,ComPtr,您自己的,它都应该可以解决问题。

关于c++ - 如何在不同的 dll 中强制销毁静态对象的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/872143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com