何时明确调用C++析构函数?

jas*_*ine 4 c++ destructor

您需要显式调用析构函数的实例是什么?

GMa*_*ckG 9

当你使用placement-new是一个常见的原因(唯一的原因?):

struct foo {};

void* memoryLocation = ::operator new(sizeof(foo));
foo* f = new (memoryLocation) foo(); // note: not safe, doesn't handle exceptions

// ...

f->~foo();
::operator delete(memoryLocation);
Run Code Online (Sandbox Code Playgroud)

这主要分别存在于分配器(由容器使用),constructdestroy函数中.

否则,不要.堆栈分配将自动完成,就像delete指针一样.(使用智能指针!)

好吧,我想这又有一个原因:当你想要未定义的行为时.然后随意多次调用它... :)

  • `new`和`delete`与`operator new`和`operator delete`不同.关键字`new`将调用具有请求大小的`operator new`并返回原始内存.在该内存中构造您的对象.关键字`delete`将破坏对象,然后使用指针调用`operator delete`以释放原始内存.我只想要原始内存,而不是构造对象,因此我不需要`new`,只需要`operator new`.`::`意味着我得到了全局函数,这只是我的习惯. (4认同)
  • 无论你是否使用`::`,它通常没有任何区别.无论你是否使用`operator`,它确实有所不同:`void*memLoc = new(sizeof(foo));`不编译. (2认同)