空析构函数的作用
What does empty destructor do?
我听说空的析构函数什么都不做,调用它也不会删除对象。但在代码中:
#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
正如您所看到的,不需要手动调用。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 空的唯一指针在离开作用域时调用析构函数
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- 析构函数体内的函数调用不起作用
- 为什么我的输出流seg出错,而我的虚拟析构函数不起作用,但当我杀死虚拟的时候,它起作用了
- 当类没有析构函数时,智能指针或作用域指针会删除对象吗
- 在作用域结束之前调用了析构函数
- 我的基类中有一个虚拟析构函数和一个数组.我怎样才能让它发挥作用
- 为什么从析构函数调用时 qCritical 或 qDebug 不起作用?
- 在对象超出作用域之前调用析构函数
- 强制对象释放/离开作用域以调用析构函数
- 离开作用域时没有调用析构函数
- 显式析构函数调用不起作用
- 关于从内存中释放链表的析构函数的逻辑和作用域的问题
- 空析构函数的作用