当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Windows 7中UAC中的蓝黄提醒框
  • 浅析数据源在JDBC中的操纵
  • Weblogic中因为IP变更招致SubCoordinator not available,Transa
  • 关于在weblogic中异步伐用webservice
  • Weblogic中的load banlance问题
  • 关于weblogic中操纵Dom4j、Xerces招致实施线程挂起的问题
  • JVM TI学习(1) 若何中止weblogic中stuck thread
  • Weblogic中几个internal的XA timeout(情况切换相关的超时)
  • 如安在基于注解气势的Spring-MVC中操纵阻碍器
  • 关于weblogic中jms message的情况
  • 关于Weblogic中XAER_NOTA XAException的两种注释
  • 关于weblogic中操纵prepared statement cache后操作DDL的问题
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .