CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

delete和析构函数的关系

楼主bnflower()2006-03-08 13:20:59 在 C/C++ / C++ 语言 提问

1)delete一个new的对象,是否就是调用了该对象的析构函数,通过析构函数来释放内存呢?  
   
  2)如果不是,那这个对象的析构函数是何时被调用的?  
   
  3)delete如何释放的对象内存空间呢?  
   
  4)如果这个对象包含了类似Clist的容器,那在delete这个对象时是如何释放这个Clist的,是通过在对象的析构函数中释放该Clist吗?  
   
   
  希望各位详解delete和析构函数的关系,谢谢了! 问题点数:50、回复次数:11Top

1 楼goodluckyxl(被人遗忘的狗)回复于 2006-03-08 13:30:42 得分 20

析构释放资源   delelte释放内存  
  看着好象有点一样其实关系并不大  
  我认为delete和析构关系是:前者是后者执行充分条件,后者对前者没有必然的影响  
   
  1.   对象只在其生命周期结束时自动调用析构函数释放对象资源  
        而delete这个动作是释放对象就是标志生命周期结束所以必然引起析构动作  
        所以delete是析构的充分条件  
  2.   而析构函数调用只是会可能使用delete来释放对象某些成员占用的内存  
        达到释放整体资源的目的。但是注意只是可能调用delete如果成员没有动态占用  
        那么就没有必要delete。所以后者对前者不必然联系  
  Top

2 楼goodluckyxl(被人遗忘的狗)回复于 2006-03-08 13:36:27 得分 0

至于说使用CList成员    
  那还是一样无非是概念的叠加解释  
  Label:  
  在对象生命周期结束时释放资源就包括这个CList成员的资源  
  在实现的时候如果CList容器放的char*   等  
  需要手动通知CList声明周期结束释放其中的资源  
  而CList这个对象也遵寻这一释放原则   此时处理回到Label处  
  Top

3 楼ugg(逸学堂(exuetang.net))回复于 2006-03-08 13:38:12 得分 10

1:  
  系统调用delete时,会在delete内调用对象的析构函数.  
  2:对象被销毁时,首先调用析构函数.析构函数也可以显示调用A   a;   a.~A();来销毁对象..  
  3:delete释放内存空间,只是对使用该块内存空间的对象,调用析构函数,并且指定该处  
  空间已经无对象使用..  
  4:如果在对象内是new出来的,在析构函数中需要delete..  
   
   
  Top

4 楼bm1408(向va_list学习~不用VC好多年~)回复于 2006-03-08 13:41:49 得分 0

狗狗,又来抢分了~Top

5 楼piaochen_2002(执子之手,与子偕老!)回复于 2006-03-08 13:43:42 得分 5

对于有析构函数的对象而言,delete   的时候之所以会调用夕构函数,是因为析构函数作为函数指针传递到了delete_var(函数名字我忘记了).先调用析构函数,在释放对象....详细参考  
  <<深度探索C++对象模型>>  
  对于有构造函数的对象,new   的时候也会把这个函数指针传递过去...Top

6 楼ox_thedarkness()回复于 2006-03-08 13:47:54 得分 10

厄,同意goodluckyxl(被人遗忘的狗)   (   )     的解释~~~  
   
  delete对象应该完成两个操作:析构和释放空间。他们没有直接联系。  
  当执行delete   时,他先调用析构函数,然后调用   operator   delete   删除这个指针。  
   
   
  不过楼主的猜测和事实并非毫无联系   ——   事实上,有些实现,比如VC   和   gcc   为了支持多继承,在虚析构函数(而不是delete运算符处)的代码段中插入代码调用   operator   delete   完成释放空间操作。Top

7 楼ox_thedarkness()回复于 2006-03-08 13:48:53 得分 0

=     =   抢分人好多阿Top

8 楼bnflower()回复于 2006-03-08 13:55:35 得分 0

在一个new对象离开起作用域时,会调用析构函数释放内存。  
   
  如果是一个com对象呢,若没有调用Release(),那他离开起作用域会自动调用析构函数来释放内存吗?Top

9 楼cattleknife(解牛刀)回复于 2006-03-08 13:56:56 得分 5

我也抢  
   
  delete和析构函数的关系:  
  delete会去调用被delete的指针所指向对象的析构函数来释放内存,而通常我们会在析构函数中使用delete,在本对象被析构之前先把对象里使用new实例化的一些对象析构,防止内存泻漏。Top

10 楼Loveflys()回复于 2006-03-08 14:26:29 得分 0

同意楼上Top

11 楼bnflower()回复于 2006-03-08 18:47:57 得分 0

谢谢各位。  
   
  明天就结帖!!!Top

相关问题

  • 析构函数
  • 析构函数?
  • 构造函数和析构函数
  • 构造函数与析构函数
  • 构造函数析构函数问题
  • 析构函数中delete报错!为什么?
  • 析构函数中delete 指针对象为什么会出错!!!!
  • 析构函数问题
  • 有关析构函数
  • c++关于析构函数!

关键词

  • 函数
  • 内存
  • 指针
  • 析构函数
  • 调用
  • 对象
  • 释放
  • clist
  • delete
  • 析构

得分解答快速导航

  • 帖主:bnflower
  • goodluckyxl
  • ugg
  • piaochen_2002
  • ox_thedarkness
  • cattleknife

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo