2

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

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

定义:

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

A createObject() {
  A object;
  return object;
}

代码:

A* object = new A();
// Use object...
object->~A();
*object = createObject();
4

2 回答 2

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());

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

  1. 永远不要在尚未销毁的现有对象之上构建对象。
  2. 在你调用了它指向的对象的析构函数之后,永远不要调用delete指针,直到你在它的位置重新构造了一个(相同类型的)对象。
于 2013-06-17T18:52:53.047 回答
3

显式调用析构函数是合法的 - 事实上,这就是你在使用Placementnew时所做的事情。当内存已分配时,“就地”初始化对象也是合法的做法,但您应该以不同的方式进行:您可以使用以下语法,而不是使用赋值运算符:

object = new (object) A(); // Placement syntax

您执行此操作的方式(使用赋值运算符)是不正确的,因为您在析构函数已完成的对象上调用函数(即赋值运算符)。

于 2013-06-17T18:52:30.147 回答