delete和析构函数的关系
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




