空析构函数有什么作用?

use*_*947 5 c++ destructor

我听说空的析构函数没有做任何事情,调用它不会删除对象.但在代码中:

#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标志.那么空构造函数实际上做了什么?它做了一些事情而我没有看过.

Lil*_*ard 7

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

如果你的类没有非POD成员变量,那么空的析构函数将真正无效.

  • @ user1873947它不会删除它们(这不是Kevin所写的); 它毁了他们. (3认同)
  • 也许.如果您的类具有基类或虚函数,则析构函数也可以执行某些操作. (2认同)
  • @ user1873947:詹姆斯说的话."delete"是指`delete`操作符,它破坏对象,然后释放对象所在的内存.在这种情况下,你只是破坏,也是一件好事,因为你的对象在堆栈而不是分配在堆上. (2认同)

csd*_*csd 6

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

首先,有错误信息."Double free"可能是因为析构函数被调用了两次:一次是由你运行,一次是在C++运行时,当变量不再在范围内时(在main函数的右括号中).

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