C++析构函数是否始终或仅在有时调用数据成员析构函数
Does a C++ destructor always or only sometimes call data member destructors?
我试图验证我对C++析构函数的理解。
我已经读过很多次,如果我自己不编写一个,C++提供一个默认析构函数。 但这是否意味着如果我确实编写了一个析构函数,编译器仍然不会提供堆栈分配的类字段的默认清理?
我的预感是,唯一理智的行为是,无论我是否提供自己的析构函数,所有类字段都会被销毁。 在这种情况下,我读了很多次的声明实际上有点误导,可以更好地表述为:
"无论你是否编写自己的析构函数,C++编译器总是 写入默认的类似析构函数的序列以释放成员 类的变量。 然后,您可以指定其他 通过定义自己的析构函数根据需要进行分配或其他任务"
这是对的吗?
当一个对象在C++中被清理时,语言将
- 首先调用类的析构函数,然后
- 调用类的所有字段的析构函数。
(这假设没有继承;如果有继承,则通过递归地遵循相同的过程来销毁基类)。因此,您编写的析构函数代码只是除了单个数据成员的常规清理代码之外,还希望执行的自定义清理代码。您不会以某种方式"丢失"那些正常调用的对象的析构函数。
希望这有帮助!
-- 对象中包含的任何对象都将作为销毁对象的一部分被销毁,即使/即使析构函数不执行任何操作来销毁它们。
事实上,析构函数通常不会执行任何操作来销毁对象中包含的对象;它通常做的是通过对象中的某些内容(例如,指向对象的指针、网络或数据库连接的句柄等)远程拥有的对象。
唯一常见的例外是,如果你的对象包含某种缓冲区,并且你已经使用放置new
在该缓冲区中构造了一些东西。如果使用放置new
,通常也计划直接调用 dtor。[请注意,"常见"可能夸大了你看到/使用它的频率 - 这确实非常罕见,但其他可能性仍然很少见。
是的。即使您确实编写了析构函数,C++编译器也会创建一个序列。请考虑以下代码:
class foo{
int a;
}
编写一个解分配a
析构函数,一个堆栈分配的变量...这是不可能的。因此,即使您编写自己的析构函数,C++编译器也必须生成一个析构函数来释放堆栈对象。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- C++成员的析构函数顺序与shared_ptr
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 工会成员的析构函数似乎是自动调用的
- 为什么类构造函数为其成员生成析构函数?
- C++类析构函数删除成员(如果"owner"?
- C++ 在析构函数调用之前删除的动态成员数组
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 在这种情况下,工会成员会调用自己的析构函数吗
- 在析构函数之后,围绕成员函数的C++lambda包装器是如何工作的
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++ 将队列作为成员的类的构造函数和析构函数
- 是否可以访问类数据成员并在析构函数中对它们执行操作?
- 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要 getter 和 setter?
- C++ 类析构函数删除部分但不是全部成员数据
- 尽管使用了 boost::scoped_ptr,我们是否应该删除析构函数中成员的指针
- C++析构函数删除包含动态数组作为数据成员的对象时的用法
- 是否应始终在析构函数中清除/归零成员数据
- C++析构函数是否始终或仅在有时调用数据成员析构函数
- 如何获取析构函数的成员函数指针