C++析构函数的作用?
谭浩强C++书上说:析构函数的作用并不是删除对象,而是在撤销对象占有的内存之前完成一些清理工作,使得这部分内存可以被程序分配给新的对象使用!!!我不明白,把对象的内存都回...
谭浩强C++书上说:析构函数的作用并不是删除对象,而是在撤销对象占有的内存之前完成一些清理工作,使得这部分内存可以被程序分配给新的对象使用!!!
我不明白,把对象的内存都回收删除了,对象怎么还会存在???好矛盾!到底是不是回收了内存,既然回收了怎么又不是删除对象??他又说在撤销对象占有的内存之前,之前,之前!!完成清理工作。那到底撤销内存了吗?? 展开
我不明白,把对象的内存都回收删除了,对象怎么还会存在???好矛盾!到底是不是回收了内存,既然回收了怎么又不是删除对象??他又说在撤销对象占有的内存之前,之前,之前!!完成清理工作。那到底撤销内存了吗?? 展开
4个回答
展开全部
析构函数是提供一个在对象删除前可以释放这个对象所占有的资源的机会。比如:
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(); 然后再会删除这两个对象。
至于你问我怎么删除的?我是知道的,但你目前的知识可能还不能理解。那是通过栈的局部变量方式来删除对象的。如果你学习了汇编与反汇编,就会明白。
谭浩强的书讲的不完全清楚,但也不能说错。
欢迎采纳!谢谢!
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(); 然后再会删除这两个对象。
至于你问我怎么删除的?我是知道的,但你目前的知识可能还不能理解。那是通过栈的局部变量方式来删除对象的。如果你学习了汇编与反汇编,就会明白。
谭浩强的书讲的不完全清楚,但也不能说错。
欢迎采纳!谢谢!
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
C++析构函数的作用是用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。
析构函数与构造函数的作用正好相反,如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭。析构函数允许类自动完成类似清理工作,不必调用其他成员函数。析构函数也是特殊的类成员函数。
析构函数简介:
析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于 构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能 重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显示的析构函数。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
比如说你定义了一个类A, 有一个成员对象是char * arrayMember; 他是一个指针,然后你定义一个A的对象 A a;使用它的arrayMember去new一块内存进行应用,然后在你收回a的内存的时候,如果不使用析构函数,你只会收回arrayMember所占的4字节内存空间,而它所指向的那段new出来的那块内存就不会被回收,析构函数所谓的清理就是帮助回收类似这样和a对象有依赖关系的内存空间,或者其他因为a的消失会跑飞的一些资源。
对象内存的回收只是意味着这个对象的成员函数 成员变量 以及其他这个对象所占有的内存的删除回收;而它所管理或者有依赖关系的一些资源的回收需要在析构函数里面进行,否则对象没了,就寻找不到他们了,他们就会成为默默存在却永远不会被使用的资源。
对象内存的回收只是意味着这个对象的成员函数 成员变量 以及其他这个对象所占有的内存的删除回收;而它所管理或者有依赖关系的一些资源的回收需要在析构函数里面进行,否则对象没了,就寻找不到他们了,他们就会成为默默存在却永远不会被使用的资源。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对象占用的内存是一定还没有撤销的,其他的就不是很清楚了,我也是一直苦于内存的工作方式。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询