空析构函数的作用

What does empty destructor do?

本文关键字:作用 析构函数      更新时间:2023-10-16

我听说空的析构函数什么都不做,调用它也不会删除对象。但在代码中:

#include <iostream>
#include <set>

class a
{
public:
    ~a() 
    {}
std::set <int> myset;
};
int main()
{
a object;
object.myset.insert(55);
object.~a();
object.myset.insert(20);
std::cout << object.myset.size();
}

我得到:"*glibc检测到*/.app:双重释放或损坏(fasttop):",然后"中止"。

如果重要的话,我启用了c++11标志。那么,空构造函数实际上是做什么的呢?它有作用,而我读到它没有。

您的析构函数可能看起来是空的,但实际上它正在破坏成员变量。在这种情况下,它正在破坏myset,因此后续的insert(20)正在崩溃。

如果您的类没有非POD成员变量,那么空的析构函数将不会执行任何操作。

您的问题提到了几个不同的问题。

首先,是错误消息。"Double-free"可能是因为析构函数被调用了两次:一次由您调用,一次由C++运行时调用,当变量不再在作用域中时(在main函数的右大括号处)。

其次,这是关于空析构函数没有移除对象的问题。事实上,它不会从内存中删除对象,但会破坏其成员变量。因此,在手动调用析构函数之后,object的内存仍然被分配,但myset不再有效。

在超出作用域时调用析构函数。我强烈建议不要调用析构函数,然后尝试访问父类的成员或成员函数。由于您的类具有成员变量myset,因此在手动调用时会取消分配这些变量,因此会出现分段错误。

当你完全处理完你的对象时,可以把析构函数想象成"清理"。在任何情况下都不应该手动调用它。

伪码:

class MyClass {
public:
  MyClass() {
    std::cout << "Constructor" << std::endl;
  }
  ~MyClass() {
     std::cout << "~Destructor" << std::endl;
   }
}
int main(int argc, char** argv) {
   MyClass myClass;
   return 0;
}

您应该看到以下输出:

Constructor

~Destructor

正如您所看到的,不需要手动调用。