免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13547 | 回复: 6
打印 上一主题 下一主题

C++中关于对象的撤销、释放、销毁、删除等说法的含义? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-25 12:11 |只看该作者 |倒序浏览
请教C++中关于对象的撤销、释放、销毁、删除等说法的含义?

初学者一个,最近想起来,对C++中的一些概念老是弄不清具体有什么区别,来请教一下。
比如,C++ Primer P633:“调用对象的析构函数撤销对象,运行析构函数并不释放对象所在内存。”

这里的撤销对象是什么意思?上面这句话说,析构撤销对象的过程不会释放对象占用的内存,那撤销对象做了什么?我一直以为析构就是用来释放内存的。。。释放内存又是什么意思?

还有如果说销毁一个对象,那会不会释放它占用的内存?

又比如有一单链表,若说删除其中一个元素,是指撤销这个元素?调用这个元素析构函数?释放这个元素?销毁这个元素?还是怎么说都一样。。。

问的有不通的地方,请指正~

论坛徽章:
0
2 [报告]
发表于 2010-04-25 12:14 |只看该作者
要是你学C的话就没这么多疑问了,,,,
C++的唯一作用就是把简单的问题复杂化!

论坛徽章:
0
3 [报告]
发表于 2010-04-25 14:02 |只看该作者
本帖最后由 numdisp 于 2010-04-25 14:05 编辑
这里的撤销对象是什么意思
...
是指撤销这个元素?调用这个元素析构函数?释放这个元素?销毁这个元素?还是怎么说都一样。。。
...
tzjotzj 发表于 2010-04-25 12:11


强烈建议你看英文原版而不是中文翻译版。如果非要看非原版的任何翻译版本的话,不要太在意那些字眼和名词,明白意思就好了。
其实我个人认为,如果对自己的英文不是那么的自信的话,就英文和中文对照着看,但是要以英文原版的为准,这样很快就能明白很多问题,同时也不至于被一些乱七八糟的名字弄晕。

论坛徽章:
0
4 [报告]
发表于 2010-04-25 16:04 |只看该作者
在使用C语言进行编程的时候,如果使用了复合的数据类型,
那么这些复合类型的数据,所占用的内存,几乎都是(要)我们在代码中手工指定的。

但是在C++里面,一个对象的数据,所占用的内存,不一定都是(能够)在代码中手工指定的。
譬如对象中的virtual table,等等。
另外C++还具有 RAII(Resource Acquire Immediately Initialized,资源获得即初始化)的语义,
在这个初始化的过程中,就是要指示编译器来处理那些用代码来处理会不太安全的内存数据初始化工作,
包括上面说到的virtual table。

要知道C++是具有面向对象的表达能力的,所以要用OO思维来理解编程语言都要面对的东西:
数据,函数(方法、过程、操作)。

在C++里面,对象的创建都有两个过程,
一,获得内存、内存分配(可能是在栈上,也可能是在堆上),
二,在获得的内存上设定数据,也就是我们说的初始化的过程,构造函数要做的东西。

所以,撤销,就是在取消对象在初始化的时候所作的一切(至少可以这么理解)
“撤销”这个动作是交给析构函数(Destructor)——构造函数(Constructor)的反义词——来做的,
所以它跟内存管理没有必然的关系。

至于你说的链表,以及容器,里面的内存管理,就看容器怎么设计了
有一些是保存引用,所以删除元素不会设计内存管理动作,而有一些会。

论坛徽章:
0
5 [报告]
发表于 2010-04-25 18:55 |只看该作者
本帖最后由 tzjotzj 于 2010-04-25 18:58 编辑

回复 4# xyfree


感谢楼上三位,就是有的书上这用词,有时会矛盾,弄得有点昏。
To numdisp:当初买的时候就买了中文版了,英文原版的好戏那个还不好找。

尤其是感谢xyfree 的回复,我认真看了下,确实有帮助的。

在C++里面,对象的创建都有两个过程,
一,获得内存、内存分配(可能是在栈上,也可能是在堆上),
二,在获得的内存上设定数据,也就是我们说的初始化的过程,构造函数要做的东西。

这个我知道,比如new一个对象就是这样的:
“一,获得内存、内存分配(可能是在栈上,也可能是在堆上)”
先是调用operator new函数来分配空间,动态分配的内存是在堆上。

“二,在获得的内存上设定数据,也就是我们说的初始化的过程,构造函数要做的东西。”
这个是调用对象的构造函数进行初始化对象,然后再返回指向对象的指针。

“撤销,就是在取消对象在初始化的时候所作的一切(至少可以这么理解)所以它跟内存管理没
有必然的关系。”


这个也就是说,撤销对象就是析构对象,而在执行析构函数时,可以释放内存也可以不释放内存
,这只看析构函数里面的语句,如果delete就释放,默认则不是放new的内存,“所以撤销对象
跟内存管理没有必然的关系”。就像placement new是在预分配的空间上构造对象,撤销对象
就显式调用他的析构函数。而因为构造函数时没有分配空间,所以析构时也没有释放空间,虽然
对象被销毁了,但是他之前占用的空间还可以再用来构造对象。
(这里释放应该把占用的内存还给系统的意思吧,撤销和销毁应该是一个意思)



“至于你说的链表,以及容器,里面的内存管理,就看容器怎么设计了
有一些是保存引用,所以删除元素不会设计内存管理动作,而有一些会。”

恩,这个我想了下,确实这样。这个删除容器(比如vector)的元素,只是改变容器的size,
但是容器的capacity还没变,所以占用的内存也没被释放。要是自己定义的删除单链表结点,
除了把结点从链表中踢出去,假如他没用了,可以自己定义操作去释放它占用的内存;假如是把
他从一个链表中删除,再插入到另一个链表中,就必不释放它占的内存。


总的来说,撤销、销毁、删除、清除对象都只是使对象不可用了,但和是否释放他们占用的内存
没什么关系;而释放就是说把他们占用的内存还给系统。

不知道这样理解还有没有什么问题...

论坛徽章:
0
6 [报告]
发表于 2010-04-26 10:45 |只看该作者
英文原版的好戏那个还不好找
tzjotzj 发表于 2010-04-25 18:55


随便搜了一下,北大居然有,要的快下。虽然是第三版。http://ai.pku.edu.cn/course/c++/ ... xing/C++_Primer.pdf

论坛徽章:
0
7 [报告]
发表于 2010-04-26 13:52 |只看该作者
回复 1# tzjotzj


  建议你学习OIOIC,
OIOIC里只有:   Create, Open, Close, Destroy
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP