【发布时间】:2015-02-04 06:44:16
【问题描述】:
如果我们第一次删除一个指针,它会释放内存并将 NULL 分配给指针。 如果我们第二次删除指针(值为NULL),什么都不会发生,也不会抛出任何错误。
那么为什么析构函数不像指针的删除那样设计呢? 我们手动调用对象的析构函数,并为对象分配一些东西,比如NULL。 这样可以多次调用析构函数而不会出错?
[更新] 我的意思是我们将 NULL 显式分配给指针。
【问题讨论】:
-
第二次删除?未定义的行为 = 任何事情都可能发生。如果可以多次调用析构函数而不会崩溃,这取决于您,但无关紧要。
-
“如果我们第一次删除一个指针,它会释放内存并将 NULL 分配给指针。” – 这不是真的。
int * x = new int; delete x; delete x;将调用未定义的行为。delete所做的是调用指向对象的析构函数,然后释放其内存。 -
在指针上调用
delete不会为其分配NULL。第二次删除指针是未定义的行为,这在某些平台上可能什么都不做,但通常会导致堆损坏。并且析构函数能够被调用两次是没有任何意义的,因为你只能破坏一次。一旦它被破坏了,它就被破坏了,期间,你不能再次破坏它。 -
那么你的问题是什么?
-
除非你使用placement new,否则手动调用析构函数几乎不是一个好案例。使用范围来控制对象的生命周期,或者使用智能指针。
标签: c++ destructor