c++ 对'this'调用析构函数然后给'this'赋一个新值是否有效?

kmynzznz  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(139)

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

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

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

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

然而,我被告知这段代码会导致未定义的行为,因为在调用this的析构函数后,我无法取消引用它。但同时我也被告知了一个更好的主意:如果我们使用placement new,就没有解引用,所以这实际上可能会起作用:

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

这感觉非常不舒服,而且很容易出错......这个代码真的有效吗?

nukf8bse

nukf8bse1#

这个代码真的有效吗?
您的代码有效。这也是一种不寻常的方法,仅仅是改变对象的值。
如果正确实现,仅赋值运算符就可以实现这一点。

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

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

相关问题