我试图验证我对C++析构函数的理解。
我已经读过很多次了,如果我不亲自编写一个默认的析构函数,C++会提供一个默认的析构函数。但这是否意味着,如果我编写了一个编译器仍然不会提供堆栈分配类字段的默认清理的析构函数?
我的预感是,唯一理智的行为是,无论我是否提供自己的析构函数,所有类字段都将被销毁。在这种情况下,我读了这么多次的声明实际上有点误导,可以更好地表述为:
“无论您是否编写您自己的析构函数,C++编译器总是编写一个默认的析构函数类序列,以释放类的成员变量。然后,您可以通过定义自己的析构函数来指定额外的解构函数或其他需要的任务”
这是正确的吗?
发布于 2013-11-09 03:36:24
在C++中清除对象时,该语言将
(这不假定继承;如果存在继承,则基类将按照相同的过程递归销毁)。因此,您编写的析构函数代码只是您想要做的自定义清理代码,以及单个数据成员的常规清理代码。您不会以某种方式“丢失”那些被调用为普通对象的析构函数。
希望这能有所帮助!
发布于 2013-11-09 03:49:19
是的--任何包含在你的物体中的物体都会被摧毁,即使你的毁灭者没有做任何事情来摧毁它们。
实际上,析构函数通常不会做任何事情来销毁对象中包含的对象;它通常所做的是销毁通过对象中的某个东西远程拥有的对象(例如指向对象的指针、指向网络或数据库连接的句柄等)。
这种情况的唯一例外是,如果您的对象包含某种类型的缓冲区,并且您已经使用placement new在该缓冲区中构造了一些东西。如果使用plan new,通常也计划直接调用dtor。请注意,“常见”可能夸大了您看到/使用这个的频率--这是非常罕见的,但其他可能性则更少。
发布于 2013-11-09 03:42:31
是。即使您确实编写了析构函数,C++编译器也会创建一个序列。考虑以下代码:
class foo{
int a;
}编写一个释放a的析构函数,一个堆栈分配的变量.这不可能。因此,即使您编写了自己的析构函数,C++编译器也必须生成一个来释放堆栈对象。
https://stackoverflow.com/questions/19872072
复制相似问题