析构函数问题

匚匚 2012-11-16 05:22:07
如果类中没有自定义析构函数,编译系统会为我们生成两个析构函数呢,还是一个?一个不执行任何操作的空析构函数,另一合成析构函数?
...全文
409 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jocodeoe 2012-11-18
  • 打赏
  • 举报
回复
如果类中分配了资源,一般需要定义析构函数来释放资源,系统先运行定义的析构函数,再运行合成析构函数按对象创建的逆序撤销每个非static成员。 如果类中没有分配资源,那就不需要自己定义析构函数。系统自动运行合成析构函数。 如果类中没有分配资源依然定义了一个空析构函数,系统先运行这个空析构函数(这里确实是什么都没做),然后运行合成析构函数。 综上所述:系统会运行自己生成的合成析构函数,不管你是否定义了自己的析构函数。若你定义了自己的析构函数,则先运行定义的析构函数。
yaoyaomu 2012-11-18
  • 打赏
  • 举报
回复
什么叫合成析构?~~太专业了~~求解~~
derekrose 2012-11-17
  • 打赏
  • 举报
回复
啥乱七八糟的,哪里来的俩,默认析构函数,就这个名字,只有一个
匚匚 2012-11-17
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
自动生成的析构函数只有一个,这样等于放弃了自主“初始化”和“清除”的机会,大多数情况下最好自定义它。
也就是说,若没自定义系统就生成一个空析构函数,若自定义了,则系统再生成一个合成析构函数?
匚匚 2012-11-17
  • 打赏
  • 举报
回复
引用 8 楼 turingo 的回复:
永远只有一个析构函数,若自定义了,就没有自动生成的了。 引用 6 楼 zhw952 的回复:引用 3 楼 turingo 的回复:自动生成的析构函数只有一个,这样等于放弃了自主“初始化”和“清除”的机会,大多数情况下最好自定义它。 也就是说,若没自定义系统就生成一个空析构函数,若自定义了,则系统再生成一个合成析构函数?
你说的与〈c++ primer〉上的有出入:与复制构造函数或赋值操作符不同,编译器总是会为我们合成一丰析构函数,它按成员在类中声明的次序的逆序撤销成员,即使我们编写了自己的析构函数,合成析构函数仍然运行。
ww710347136 2012-11-17
  • 打赏
  • 举报
回复
默认析构函数不是什么都不做么,那个合成的是个什么意思,没听过……哪位大侠能不能解释下
似梦飞花 2012-11-17
  • 打赏
  • 举报
回复
一个,自定义之后运行自定义的
匚匚 2012-11-17
  • 打赏
  • 举报
回复
引用 12 楼 Binzo 的回复:
你理解的这个合成的大概就是大家说的什么都不做的。
不是这样的,合成的有时有重大使命
图灵狗 2012-11-17
  • 打赏
  • 举报
回复
永远只有一个析构函数,若自定义了,就没有自动生成的了。
引用 6 楼 zhw952 的回复:
引用 3 楼 turingo 的回复:自动生成的析构函数只有一个,这样等于放弃了自主“初始化”和“清除”的机会,大多数情况下最好自定义它。 也就是说,若没自定义系统就生成一个空析构函数,若自定义了,则系统再生成一个合成析构函数?
Binzo 2012-11-17
  • 打赏
  • 举报
回复
你理解的这个合成的大概就是大家说的什么都不做的。
iNemesis 2012-11-17
  • 打赏
  • 举报
回复
引用 9 楼 zzgzzg00 的回复:
一个,自定义之后运行自定义的
我记得有一个合成析构函数,好像用来逆序撤销每个非static成员。
飞天御剑流 2012-11-16
  • 打赏
  • 举报
回复
对于抽象语义,系统必定会提供一个默认析构函数,但C++标准允许一个实现在某些时候(例如所谓的trival)不实际产生析构函数,只要在效果上与抽象语义一致,这就是实现语义。
niu05500230 2012-11-16
  • 打赏
  • 举报
回复
引用 楼主 zhw952 的回复:
如果类中没有自定义析构函数,编译系统会为我们生成两个析构函数呢,还是一个?一个不执行任何操作的空析构函数,另一合成析构函数?
只会生成一个,空的,不做任何事
图灵狗 2012-11-16
  • 打赏
  • 举报
回复
自动生成的析构函数只有一个,这样等于放弃了自主“初始化”和“清除”的机会,大多数情况下最好自定义它。
匚匚 2012-11-16
  • 打赏
  • 举报
回复
引用 1 楼 Michael_g 的回复:
编译器不会给你生成所谓的析构函数,假设编译器即使生成了,那么这个析构函数做什么呢,呵呵。
你确信?c++ primer里讲,即使编写了自己的析构函数,合成的析构函数仍然运行
Michael_g 2012-11-16
  • 打赏
  • 举报
回复
编译器不会给你生成所谓的析构函数,假设编译器即使生成了,那么这个析构函数做什么呢,呵呵。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧