gpt4 book ai didi

c++ - 在 C++ 中强制最后破坏某些东西

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:40 27 4
gpt4 key购买 nike

我正在开发一个 C++ 应用程序,它内部有一些定期创建和销毁的 Controller 对象(使用 new)。这些 Controller 有必要将自己注册到另一个对象(我们称之为 controllerSupervisor),并在它们被破坏时注销自己。

当我退出应用程序时,我现在面临的问题是:由于销毁顺序不确定,因此单个 controllerSupervisor 实例在(某些) Controller 本身之前被销毁,并且当它们调用在他们的析构函数中注销方法,他们在一个已经被破坏的对象上这样做。

到目前为止,我想到的唯一想法(重感冒,所以这可能意义不大)不是将 controllerSupervisor 作为堆栈上的全局变量,而是放在堆上(即使用 new)。但是在那种情况下,我没有地方可以删除它(这都在第 3 方类型的库中)。

任何有关可能选项的提示/建议都将不胜感激。

最佳答案

自动变量(包括您在函数中使用的“普通”局部变量)的销毁顺序与其创建顺序相反。所以把 controllerSupervisor 放在最上面。

全局变量的销毁顺序也与它们的创建顺序相反,这又取决于它们被定义的顺序:稍后定义的对象被稍后创建。但请注意:不能保证以任何定义的顺序创建在不同 .cpp 文件(翻译单元)中定义的对象。

我认为您应该考虑按照 Mike 的建议使用它:

  1. 创建是通过在首次使用时使用单例模式(因为不同翻译单元中的对象的初始化顺序未定义)完成的,方法是返回指向函数静态监督对象的指针。
  2. 监督者通常被破坏(使用关于函数中静态破坏的规则)。 Controller 使用主管的静态功能注销。那一个检查主管是否已经被破坏(检查 != 0 的指针)。如果是,则什么都不做。否则通知主管。

因为我想象可能有一个没有连接 Controller 的监督者(如果只是暂时的),智能指针不能用于自动破坏监督者。

关于c++ - 在 C++ 中强制最后破坏某些东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/288217/

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