我听说空的析构函数没有做任何事情,调用它不会删除对象.但在代码中:
#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();
}
Run Code Online (Sandbox Code Playgroud)
我得到:" *glibc检测到* /.app:双重免费或腐败(fasttop):"然后"ABORT".
如果重要的话我启用了c ++ 11标志.那么空构造函数实际上做了什么?它做了一些事情而我没有看过.
你的析构函数可能看起来是空的,但它实际上是在破坏成员变量.在这种情况下,它正在破坏myset,因此后续insert(20)崩溃.
如果你的类没有非POD成员变量,那么空的析构函数将真正无效.
您的问题提到了几个不同的问题.
首先,有错误信息."Double free"可能是因为析构函数被调用了两次:一次是由你运行,一次是在C++运行时,当变量不再在范围内时(在main函数的右括号中).
其次,你有关于空析构函数没有删除对象的问题.实际上,它不会从内存中删除对象,但它会破坏其成员变量.因此,在手动调用析构函数后,object仍然会分配内存,但myset不再有效.