2010-02-04 36 views
3

比方说,我有2个单独的,分配在堆上,没有任何删除被称为。我们称他们为A和B.有什么方法可以确保B成为第一个被销毁的人?如何控制订单堆对象被销毁?

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

+0

阅读此:http://stackoverflow.com/questions/335369/finding-c-static-initialization-order-problems/335746#335746 – 2010-02-04 14:08:27

+0

如果它们之间的破坏顺序很重要,是不是一个暗示与大锤,你不应该让他们单身? – jalf 2010-02-04 14:23:14

回答

5

如果它们是分配给普通指针的堆,并且这些指针永远不会调用delete,那么它们将永远不会被销毁,所以销毁的顺序是没有意义的。

在另一方面,如果你将其分配到静态的智能指针,如果他们在同一个翻译单元,然后创建了第一个将是最后一个被破坏:

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

并让有不用费钱去解决静态问题:-)

+0

Nipticking。优秀的词。从没听说过。 (我不是以英语为母语的人)谢谢,但我不能多说一点。抱歉。 – Notinlist 2010-02-04 14:06:55

4

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

+3

根据链接它是LIFO,我相信。 – 2010-02-04 14:03:17

+0

谢谢,刚刚搞混了。 – 2010-02-04 14:12:38

+0

不管它是LIFO还是FIFO。您可以注册_one_'atexit'函数,以您想要的任何顺序删除单例。 – 2010-02-04 14:14:37

1

简短的回答:是的

龙答:
阅读:Finding C++ static initialization order problems

摘要:

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

为了确保必须A.之前创建的,那么B之前,要做到这一点刚刚做出的构造得到B.

的实例

在这里看到B被破坏:C++ Singleton design pattern对于许多关于singeltons链接。