当前位置:  开发笔记 > 编程语言 > 正文

在C++中强制要破坏某些东西

如何解决《在C++中强制要破坏某些东西》经验,为你挑选了2个好方法。

我正在开发一个C++应用程序,它内部有一些控制器对象,这些控制器对象是定期创建和销毁的(使用new).这些控制器必须将自己注册到另一个对象(让我们称之为controllerSupervisor),并在它们被销毁时取消注册.

当我退出应用程序时,我现在面临的问题是:由于破坏的顺序不是确定性的,因此在控制器本身(某些)之前,单个controllerSupervisor实例被破坏,并且当它们调用unregister方法时他们的析构函数,他们在已经被破坏的物体上这样做.

到目前为止我提出的唯一想法(有一个很大的冷,所以这可能并不重要)并没有将controllerSupervisor作为堆栈上的全局变量,而是在堆上(即使用new).但是在那种情况下我没有地方可以删除它(这都是第三方类型的库).

任何可能的选项的提示/建议将不胜感激.



1> Johannes Sch..:

自动变量的破坏顺序(包括您在函数中使用的"普通"局部变量)的顺序与它们的创建顺序相反.所以将controllerSupervisor置于顶部.

全局变量的破坏顺序也与它们的创建相反,而这又取决于它们的定义顺序:后来定义的对象是在以后创建的.但要注意:不保证以任何定义的顺序创建在不同的.cpp文件(翻译单元)中定义的对象.

我认为你应该考虑使用迈克推荐的方式:

    通过返回指向函数静态管理程序对象的指针,在第一次使用时使用单例模式(因为未定义不同翻译单元中的对象的初始化顺序)来完成创建.

    主管通常被破坏(使用关于破坏功能中的静力学的规则).控制器使用管理程序的静态功能取消注册.那个检查主管是否已经被破坏(检查指针!= 0).如果是,那么什么也没做.否则通知主管.

因为我想可能有一个没有控制器连接的主管(如果只是临时的),智能指针不能用于自动销毁主管.



2> Alastair..:

在Alexandrescu的Modern C++ Design(Chaper 6,Singletons)中,基本上有一章关于这个主题.他定义了一个单例类,它可以管理依赖关系,甚至可以管理单例本身.

BTW强烈推荐全书.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有