c++析构函数是虚函数应用?

印象中显式调用析构函数在 C++11 后才被允许,今天一时兴起查了查,结果发现了很多有趣的事。

以下文章主要参考 ,本人太菜,只能读中文版的二手文档,没看英文的 cppreference 和几千页 c++ standard

首先,显式调用析构函数在 C++11 前就能用了,形如 X.~Y() 的表达式前半部分 X.~Y 是一个表达式,对其的描述明确写了“包括析构函数在内”,后半部分则是一个函数调用,当然也可以将两部分是为一个整体,因为对非静态成员函数的访问结果只能用作成员函数调用运算符的左操作数。

注意到“内建的成员访问运算符”还专门规定了“伪析构函数”,用来形式地调用 int 这种内建标量类型的析构函数。但是以下语句是不行的:

对于 #1,词法分析时的最大吞噬规则将 1. 解析为浮点字面量,于是语法错误;

对于 #2,伪析构函数的规则里说明 ~ 后应该跟

代表(移除 cv 限定后)相同类型的类型名或 decltype 说明符,可选地有限定

这个“类型名”有专门的定义:

所以 int 是关键字而非类型名,不能用在伪析构函数访问中……(坑爹

}

析构函数主要作用释放资源避免内存泄漏
类里面只用基本类型int
double等系统默认析构函数其实都没有做
使用了其类vectorstring等系统默认析构函数会调用些类对象析构函数
自己写析构函数类里面分配了系统资源new了内存空间打开了文件等析构函数必须释放相应内存空间和关闭相关文件;样系统会自动调用析构函数释放资源避免内存泄漏

你对这个回答的评价是?

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

}

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

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

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

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

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

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

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


· TA获得超过1.6万个赞

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

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

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

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

对象占用的内存是一定还没有撤销的,其他的就不是很清楚了,我也是一直苦于内存的工作方式。。。。

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 析构函数是虚函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信