正在成员函数中调用析构函数
Calling destructor in member function
例如,如果我们正在实现智能指针,并且我们想要执行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
}
};
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常