假设我正在实现某个类A
,它有一个clear()
方法,该方法应该将对象状态设置为“全新”状态,就像它刚刚用构造函数创建一样:
- 我应该释放当前对象正在使用的所有资源(与
A::~A()
所做的完全相同), - 然后我应该再次初始化这些资源(与
A::A()
所做的完全相同)。
所以我最初的想法是这样的:
void A::clear() {
this->~A();
*this = A();
}
然而,我被告知这段代码会导致未定义的行为,因为在调用this
的析构函数后,我无法取消引用它。但同时我也被告知了一个更好的主意:如果我们使用placement new,就没有解引用,所以这实际上可能会起作用:
void A::clear() {
this->~A();
new (this) A();
}
这感觉非常不舒服,而且很容易出错......这个代码真的有效吗?
1条答案
按热度按时间nukf8bse1#
这个代码真的有效吗?
您的代码有效。这也是一种不寻常的方法,仅仅是改变对象的值。
如果正确实现,仅赋值运算符就可以实现这一点。
如果此代码未按预期工作,则表示您的赋值运算符实现不正确。