1

假设我正在实现某个类,该类A有一个clear()方法应该将对象状态设置为“全新”状态,就好像它刚刚使用构造函数创建一样:

  • 我应该释放当前对象正在使用的所有资源(完全相同A::~A()),
  • 然后我应该再次初始化这些资源(完全相同A::A())。

所以我最初的想法是这样的:

void A::clear() {
  this->~A();
  *this = A();
}

this但是,我被告知此代码会导致 UB,因为在调用其析构函数后我无法取消引用。但同时我也被告知了一个更好的主意:如果我们使用placement new,就没有解除引用,所以这实际上可能有效:

void A::clear() {
  this->~A();
  new (this) A();
}

这让人感觉非常不舒服,而且很容易出错……那么这段代码真的有效吗?

4

1 回答 1

1

这段代码真的有效吗?

您的代码有效。仅仅改变对象的值也是一种相当不寻常的方法。

如果正确实施,单独的赋值运算符将实现这一点。

void A::clear() {
  *this = A();
}

如果此代码未按预期工作,则您的赋值运算符未正确实现。

于 2021-07-02T21:44:25.117 回答