为什么析构函数不会在放置新的"隐式调用"?

3 c++

正如本网站所提及的那样... http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10 但是我没有找到原因,为什么我们应该明确地调用desturctor?

Tod*_*ner 11

您可以将其视为删除调用,但由于您使用了placement new,因此您不希望使用delete,因为这会尝试释放内存.如果您希望自动调用它,您可以使用RAII:

// Could use a templated version, or find an existing impl somewhere:
void destroy_fred(Fred* f) {
   f->~Fred();
}

void someCode()
{
   char memory[sizeof(Fred)];
   void* p = memory;
   boost::shared_ptr<Fred> f(new(p) Fred(), destroy_fred);

   // ...

   // No need for an explicit destructor, cleaned up even during an exception
} 
Run Code Online (Sandbox Code Playgroud)


Mat*_*hen 10

通常,newed对象在delete被调用时被破坏.删除永远不会被调用为新的,所以你必须弄清楚何时自己破坏对象,并明确地这样做.


小智 8

您不能调用普通的delete,因为这会尝试释放未使用普通new分配的内存,因此您可以直接调用析构函数,然后根据您使用的体系结构处理底层内存分配。