假设我正在实现某个类,该类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();
}
这让人感觉非常不舒服,而且很容易出错……那么这段代码真的有效吗?