C++析构函数的作用?

谭浩强C++书上说:析构函数的作用并不是删除对象,而是在撤销对象占有的内存之前完成一些清理工作,使得这部分内存可以被程序分配给新的对象使用!!!

我不明白,把对象的内存都回收删除了,对象怎么还会存在???好矛盾!到底是不是回收了内存,既然回收了怎么又不是删除对象??他又说在撤销对象占有的内存之前,之前,之前!!完成清理工作。那到底撤销内存了吗??

析构函数是提供一个在对象删除前可以释放这个对象所占有的资源的机会。比如:
class A
{
A(){m_a=new int[10];}
~A(){delete [] m_a;}

int * m_a;

}
这种情况,你就可以清楚的看到,析构函数提供了一个释放m_a所占用的内存的机会——当然释放的动作还需要你使用delete来做到。这就是所谓的【在撤销对象占有的内存之前完成一些清理工作】的情形之一;还有就是再复杂一点的情况,请看下面例子:

class B
{
B(){}

~B(){}

A a;

}
这个情况下,构造函数B()会自动调用A()函数来做A.m_a的初始化工作;而析构函数~B()会自动调用A的析构函数~A()做清除内存的动作。
还有其他更复杂的情况,但原理都是提供了一个清理内存的机会。删除对象是编译器所做的工作,如你写一段如下代码:
int main()
{
int k = 10;

int d = 100;

int s = k+d;

return s;
}
像k,d,s这几个变量,都是函数内的局部变量,只存在于main()函数的生命周期里面,出了main函数就不存在了——注意,是不存在,不是不可见!因为在退出函数之前要做删除这些局部变量的动作。
那么,这里是没有析构函数的,但对象是在main函数结构的时候删除的,也就是删除对象。这里没有动态内存。删除k,d,s对象的动作是和有析构函数的情况是一样的;只是有了析构函数,就会在这个删除对象动作之前做一些其他的清除内存的工作(像我上面举的两个析构函数例子);请看:
int main()
{
A a;

B b;

}
这种情况,同样在main退出的时候,也是会和上面的k, d, s一样删除b对象的,没什么区别。但是B是一个类,就会在删除b对象之前调用B的析构函数~B()!
OK?删除对象,是在析构函数之后进行的,这个变量出生命周期的时候就会先后调用~A(); ~B(); 然后再会删除这两个对象。
至于你问我怎么删除的?我是知道的,但你目前的知识可能还不能理解。那是通过栈的局部变量方式来删除对象的。如果你学习了汇编与反汇编,就会明白。

谭浩强的书讲的不完全清楚,但也不能说错。

欢迎采纳!谢谢!
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-03-30

C++析构函数的作用是用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。

析构函数与构造函数的作用正好相反,如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭。析构函数允许类自动完成类似清理工作,不必调用其他成员函数。析构函数也是特殊的类成员函数。

析构函数简介:

析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于 构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能 重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显示的析构函数。

本回答被网友采纳
第2个回答  2013-08-05
比如说你定义了一个类A, 有一个成员对象是char * arrayMember; 他是一个指针,然后你定义一个A的对象 A a;使用它的arrayMember去new一块内存进行应用,然后在你收回a的内存的时候,如果不使用析构函数,你只会收回arrayMember所占的4字节内存空间,而它所指向的那段new出来的那块内存就不会被回收,析构函数所谓的清理就是帮助回收类似这样和a对象有依赖关系的内存空间,或者其他因为a的消失会跑飞的一些资源。
对象内存的回收只是意味着这个对象的成员函数 成员变量 以及其他这个对象所占有的内存的删除回收;而它所管理或者有依赖关系的一些资源的回收需要在析构函数里面进行,否则对象没了,就寻找不到他们了,他们就会成为默默存在却永远不会被使用的资源。
第3个回答  2013-08-05
对象占用的内存是一定还没有撤销的,其他的就不是很清楚了,我也是一直苦于内存的工作方式。。。。

析构函数到底有什么作用
析构函数的作用是进行资源的清理和程序的收尾工作。详细解释如下:1. 资源清理 在C++中,当一个对象不再被使用时,其析构函数会被自动调用。这是析构函数最重要的作用之一,即进行资源的清理。这些资源可能包括动态分配的内存、打开的文件、数据库连接等。通过析构函数,我们可以确保这些资源在对象生命周...

C++析构函数的作用是什么?
C++析构函数的作用是用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。析构函数与构造函数的作用正好相反,如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭。析构函数允许类自动完成类似清理工作,不必调用其他成员函数。析构函数也是特殊的类成员函数。析构函数简介:析构函数名也...

c++中析构函数有什么作用?在什么情况下用?
析构函数主要作用就是释放资源,避免内存泄漏。1、析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间。2、析构函数如果我们不写的话,C++ 会帮我们...

C++中析构函数的作用?
所以使用析构函数在程序结束的时候逐一清除被占用的动态堆内存空间,否则就会造成内存泄露,使系统内存不断减少系统效率将大大降低。

c++ 什么是析构函数?它的作用是什么?
在C++中,析构函数是一种特殊成员函数,负责清理对象生命周期结束时的资源。当对象作用域结束、被delete或程序结束时,自动调用析构函数。其主要作用是释放对象占用的资源,如动态内存、文件句柄、网络连接等。在析构函数中,编写清理代码,确保资源正确释放,避免资源泄漏和内存泄漏。对象不再使用时,内存需...

析构函数的作用
析构函数的作用在于确保对象在生命周期结束时进行资源的清理和恢复。具体来说,当一个对象不再需要或者被删除时,析构函数被调用,以释放内存、关闭文件或解除对其他资源的引用等。在类的实例被销毁时,析构函数按照定义的顺序调用,以确保正确地清理资源,避免内存泄漏或其他资源管理错误。通过在基类中定义...

C++析构函数有什么作用
析构函数也是特殊的类成员函数。简单来说,析构函数与构造函数的作用正好相反,它用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。析构函数是提供一个在对象删除前可以释放这个对象所占有的资源的机会。比如:class A { A(){m_a=new int[10];} ~A(){delete [] m_a;} int * m...

c++析构函数的作用和语法是什么
在C++中“~”是位取反运算符,从这点也可以想到:析构函数是与构造函数作用相反的函数。当对象的生命期结束时,会自动执行析构函数。具体地说如果出现以下几种情况,程序就会执行析构函数:①如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前...

c++中的析构函数与构造函数的区别
1、概念不同:析构函数:对象所在的函数已调用完毕时,系统自动执行析构函数。构造函数:是一种特殊的方法。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。2、作用不同:析构函数:析构函数被调用。构造函数:为对象成员变量赋初始值 3、...

什么是析构函数
析构函数是C++编程中的重要概念,它是一种特殊的成员函数,专门用于对象生命周期结束时进行必要的资源清理。当对象不再存在,例如超出作用域、程序结束或手动释放动态内存时,析构函数会在自动调用下执行,以确保资源的正确释放和状态的归零。析构函数的定义遵循特定规则,以波浪线(~)开头,后跟类名,它...

相似回答