假设我在堆上分配了2个单例,其中没有调用任何删除。让我们称他们为A和B.有没有办法确保B成为第一个被摧毁的人?
我认为这个平台可能很重要:Visual Studio 2005 Professional,Visual C ++。一切都是用cl
构建的。
答案 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的大量链接。