手动调用析构函数并重用内存

Wae*_*elJ 2 c++ destructor explicit-destructor-call

虽然我知道这可能不是最好的想法,但我假设:

(即定义行为)手动调用对象的析构函数,然后将内存重用于另一个对象是否合法?

定义:

class A {
  int a, b, c;
  A() {}
  ~A() {}
}

A createObject() {
  A object;
  return object;
}
Run Code Online (Sandbox Code Playgroud)

码:

A* object = new A();
// Use object...
object->~A();
*object = createObject();
Run Code Online (Sandbox Code Playgroud)

Ben*_*ley 6

您无法像正在执行的那样在已销毁的对象上调用赋值运算符.至少一般情况下,虽然它可能适用于某些类型.你能做的就是:

A* object = new A();
object->~A();
// Placement new.
// Constructs a new object in the memory pointed to by object pointer.
// Doesn't allocate memory.
new (object) A(createObject());
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用placement new来构造该内存中不同类型的对象,只要它们适合.只要确定两件事:

  1. 不要在已经存在的未被破坏的对象之上构造对象.
  2. delete在它指向的对象上调用析构函数之后,不要调用指针,直到你在其位置重新构造一个对象(相同类型).