C++中的废料汇集[VC/C++编程]
本文“C++中的废料汇集[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Java的爱好者们常常批判C++中没有供应与Java近似的废料汇集(Gabage Collector)机制(这很正常,正如C++的爱好者有时也攻击Java没有这个没有那个,大概这个不行那个不够好),招致C++中对动态存储的官吏称为程序员的恶梦,不是吗?你常常听到的是内存丢失(memory leak)和不法指针存取,这一定令你很头疼,并且你又不能丢弃指针带来的机动性.
在本文中,我并不想揭穿Java供应的废料汇集机制的天生缺陷,而是指出了C++中引入废料汇集的可行性.请读者注意,这里介绍的办法更多的是基于当前尺度和库计划的角度,而不是要求改正语言定义大概扩大编译器.
1 什么是废料汇集?
作为支持指针的编程语言,C++将动态管理存储器资源的便利性交给了程序员.在利用指针情势的对象时(请注意,由于引用在初始化后不能更改引用目标的语言机制的限制,多态性利用大大都情形下依靠于指针举行),程序员必须自己完成存储器的分配、利用和释放,语言本身在此历程中不能供应任何帮忙,大概除了按照你的要求精确的和操作系统密切合作,完成实际的存储器管理.尺度文本中,多次提到了“未定义(undefined)”,而这大大都情形下和指针相关.
某些语言供应了废料汇集机制,也就是说程序员仅负责分配存储器和利用,而由语言本身负责释放不再利用的存储器,这样程序员就从讨厌的存储器管理的工作中脱身了.但是C++并没有供应近似的机制,C++的计划者Bjarne Stroustrup在我所知的唯一一本介绍语言计划的思惟和哲学的著作《The Design and Evolution of C++》(中译本:C++语言的计划和演变)中花了一个小节谈论这个特点.简而言之,Bjarne本人认为,
“我有意这样计划C++,使它不依靠于自动废料汇集(普通就直接说废料汇集).这是基于自己对废料汇集系统的经验,我很惊骇那种严重的空间和时间开销,也惊骇由于实现和移植废料汇集系统而带来的复杂性.还有,废料汇集将使C++不合适做很多底层的工作,而这却恰是它的一个计划目标.但我喜好废料汇集的思惟,它是一种机制,可以简化计划、排撤除很多产生错误的本源.
需求废料汇集的基本来由是很简单理解的:用户的利用便利以及比用户供应的存储管理情势更坚固.而反对废料汇集的来由也有很多,但都不是最根本的,而是关于实现和效率方面的.
已经有充分多的论据可以辩驳:每个利用在有了废料汇集之后会做的更好些.近似的,也有充分的论据可以反对:没有利用大概因为有了废料汇集而做得更好.
并非每个程序都需求永久无停止的运行下去;并非全部的代码都是底子性的库代码;关于很多利用而言,呈现一点存储流失是可以承受的;很多利用可以管理自己的存储,而不需求废料汇集大概其他与之相关的技术,如引用计数等.
我的结论是,从原则上和可行性上说,废料汇集都是需求的.但是对本日的用户以及广泛的利用和硬件而言,我们还无法承受将C++的语义和它的基本库定义在废料汇集系统之上的负担.”
以我之见,统一的自动废料汇集系统无法实用于各种差别的利用环境,而又不至于招致实现上的负担.稍后我将计划一个针对特定范例的可选的废料汇集器,可以很明显地看到,或多或少老是存在一些效率上的开销,假如逼迫C++用户必须承受这一点,大概是不可取的.
关于为什么C++没有废料汇集以及大概的在C++中为此做出的勤奋,上面提到的著作是我所看过的对这个问题论述的最全面的,固然只有短短的一个小节的内容,但是已经涵盖了很多内容,这恰是Bjarne著作的一贯特点,言简意赅而内韵实足.
下面一步一步地向大家介绍我自己土制佳酿的废料汇集系统,可以按照需求安闲选用,而不影响其他代码.
2 构造函数和析构函数
C++中供应的构造函数和析构函数很好的办理了自动释放资源的需求.Bjarne有一句名言,“资源需求就是初始化(Resource Inquirment Is Initialization)”.
因此,我们可以将需求分配的资源在构造函数中申请完成,而在析构函数中释放已经分配的资源,只要对象的生存期完毕,对象恳求分配的资源即被自动释放.
那么就仅剩下一个问题了,假如对象本身是在安闲存储区(Free Store,也就是所谓的“堆”)中动态成立的,并由指针管理(相信你已经知道为什么了),则还是必须通过编码显式的调用析构函数,当然是借助指针的delete表达式.
以上是“C++中的废料汇集[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:C++多态技术
- ·下一篇文章:<b>在名字空间中声明类和成员函数</b>
- ·中查找“C++中的废料汇集”更多相关内容
- ·中查找“C++中的废料汇集”更多相关内容