正在成员函数中调用析构函数

Calling destructor in member function

本文关键字:调用 析构函数 函数 成员      更新时间:2024-09-23

例如,如果我们正在实现智能指针,并且我们想要执行a = std::move(b)---我们需要删除a所指向的内存,但我们可以在移动赋值运算符内部调用析构函数,而不是复制粘贴析构函数的函数体吗?

是否定义了在移动赋值内部调用析构函数的行为

如果不是,有没有更好的方法来处理它,而不是复制粘贴析构函数的主体?

您可以在成员函数内部调用this上的析构函数,它具有定义良好的行为。

然而,该行为涉及结束对象*this的生存期。在析构函数调用之后,您将不再被允许访问/使用对象的任何成员。这在许多情况下也会产生不良后果,例如,如果对象具有自动存储持续时间,则在作用域退出期间将对其再次调用析构函数,这将导致未定义的行为。

所以这对你想做的事情没有用。

尽管我强烈建议不要这样做,但理论上,您可以在析构函数调用之后,通过placementnew在同一存储位置构造一个新对象。然而,在不导致未定义行为的情况下允许这样做的时候,类控制之外还有一些先决条件。在某些条件下,这样的放置new本身可能是未定义的行为,在某些情况下,如果在放置new之后使用,则引用旧对象的名称/引用/指针将不会引用导致未定义行为的新对象,并且在某些条件下*this是其子对象/成员的任何父对象的生存期也将通过这样的操作结束,如果以后使用,则会导致未定义的行为。

您可以在标准(草案(中看到如何根据我的建议并在某些(未说明的(假设下实现这一点的演示:https://timsong-cpp.github.io/cppwp/n4868/basic.life#example-2

链接的例子和前面的一段并没有阐明我上面暗示的方法的所有条件和可能的问题。只有示例中显示的类/函数的特定用法才被明确允许。


如果您只想重用代码,请将析构函数的主体移动到一个新的成员函数中,并从需要相同行为的两个位置调用该函数。

明确调用destuctor在技术上是可用的,您可以在类Object的非静态方法中使用this->~Object()

然而,这是一种糟糕的做法。请考虑改用这些。

class Test {
public:
Test() {}
~Test() {
Deallocate();
}
Test(const Test& other) = delete;
Test(Test&& other) {
Deallocate();
// Do sth
}
private:
void Deallocate() {
// Do sth
}
};