【问题标题】:C++: why isn't the destructor designed like delete of a pointer? [closed]C++:为什么析构函数的设计不像指针的删除? [关闭]
【发布时间】: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


【解决方案1】:

构造函数和析构函数的全部目的是避免手动调用析构函数。它的设计使对象在不再使用时会自动销毁。这使得程序员更难意外忘记删除对象;或使用已被删除的对象。

【讨论】:

  • 谢谢。是的,我问的是设计目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2018-01-25
  • 2021-04-04
  • 1970-01-01
  • 2014-12-30
  • 2011-02-06
  • 2011-06-07
相关资源
最近更新 更多