如何控制订单堆对象被销毁?

时间:2010-02-04 13:46:42

标签: c++ singleton heap destructor

假设我在堆上分配了2个单例,其中没有调用任何删除。让我们称他们为A和B.有没有办法确保B成为第一个被摧毁的人?

我认为这个平台可能很重要:Visual Studio 2005 Professional,Visual C ++。一切都是用cl构建的。

3 个答案:

答案 0 :(得分:5)

如果它们是堆分配给普通指针,并且如果从未在这些指针上调用delete,那么它们永远不会被销毁,因此破坏的顺序没有实际意义。

另一方面,如果将它们分配给静态智能指针,并且它们位于同一个翻译单元中,那么创建的第一个将是最后一个被销毁的:

static std::auto_ptr <AType> a( new AType );  // destroyed second
static std::auto_ptr <BType> b( new BType );  // destroyed first

让我们不要讨论静态被弃用的问题: - )

答案 1 :(得分:4)

您可以在atexit即LIFO中注册删除您的单身人士。

答案 2 :(得分:1)

简答:是的

长答案:
阅读:Finding C++ static initialization order problems

要点:

基本上如果你使用静态函数变量的经典模式来创建你的singeltons(所以你得到懒惰的评估并保证破坏),那么破坏的顺序就是创建顺序的反转。

要确保在A之前销毁B,那么必须在A之前创建B.要做到这一点,只需使A的构造函数得到B的实例。

请参阅此处:C++ Singleton design pattern了解有关singeltons的大量链接。