再论C++之垃圾回收(GC)

原创 2006年11月24日 02:04:00
本文已经迁移到: http://cpp.winxgui.com/cn:garbage-collection-in-cplusplus

使用智能指针(smart pointers)

  • http://www.codeproject.com/cpp/garbage_collect.asp
  • 原理:基于引用计数(reference count)。

    这种垃圾回收(gc)算法无非都是给每一块分配的内存提供引用计数,然后通过智能指针(smart pointer)自动完成引用计数的加减,如果引用技术减少到零,就代表没有人使用该内存了,这块内存就可以回收了。

    如果可以正确的遵从这种gc的使用规则,也就是说你可以正确无误的使用智能指针,那么理论上来说,就不可能存在内存泄漏。
     
    但是现实并不象想象的那么单纯,那么美好。一方面,智能指针的概念仍然没有被C++社区广泛的理解应用,而且智能指针种类繁多,各有各的规则,在代码量多了的时候,有时存在这样那样的失误难免;另一方面(应该是更加令人为难的一点),并不是所有人都那么喜欢用智能指针,而且原生指针的使用很多情形下避无可避,我们不得不在原生指针与智能指针之间进行转换。
     
    所以这样的gc的最终结果是,掌握引用计数的规则最终似乎比掌握new/delete的规则容易不了多少,有时甚至让新接触该技术的程序员感到畏惧。另外,引用计数的引入,出乎意料的产生了一个负作用:调试内存泄漏变得比原先困难多了。
     
    所以引用计数和智能指针实现的gc不能从根本上解决内存泄漏问题。

真正的垃圾回收(garbage collector)

  • 请注意,C++并非不支持GC。我们知道BN一直强调的是,GC是C++的可选组件,不是必需的。
  • 这里是C++的GC相关代码以及文档:
  • 评价:如果你的系统很单纯,采用这个是不错的主意。因为这意味着你的C++语言已经和Java、C#没有任何区别。但是请注意,这要求你的系统是纯粹的,也就是说:
     
    • 你没有是使用第三方代码。或者,你的第三方代码中,内存也是托管的(通过GC创建出来的)。
       
    • 小心与那些你无法取得源代码的DLL(例如,Win32 API/你购买的第三方组件)打交道。与C#一样,你需要小心,不要让你的程序出现Win32 API还在访问数据,而被GC回收的情形。不过这种情况在C++中比C#要好得多:毕竟在C++中,你对GC的控制能力远远强于C#。
       
    • 特别地、如果你使用了COM,那么你将很痛苦:因为COM基于引用计数来管理对象生命周期,这意味着GC基本上对其无能为力。除非你像C#一样,为每个COM组件提供一个Wrapper。

补充:

  • 由于GC依赖语言的自省(reflection)能力,而C++这方面的能力无疑相当得弱,因此C++中的GC是尴尬的。
  • 请注意,GC是排他的,这意味着两个GC不能在一起工作。因此,除非C++标准规定了必须使用那个GC,不然托管的C++代码,存在着交流困难。
     

支持垃圾回收的allocator(gc allocator)

  • 代码与文档:
  • 评价:半自动的垃圾回收,比GC简单、高效、容易控制。

GC基本算法及C++GC机制

前言 垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配的块,这些块也称为垃圾。在程序员看来,垃圾就是不再被引用的对象。自动回收垃圾的过程则称为垃圾收集(garbage collectio...
  • u014550279
  • u014550279
  • 2016-01-18 16:51:33
  • 832

C++简单实现GC和内存池

C++简单实现GC和内存池   本章前言:     这章就是为了避开传统的new\delete创建堆对象的手法,如果使用不当指针容易出现问题,所以本章简单的实现了引用计数垃圾回收,使用起来貌似还不错。...
  • u014629601
  • u014629601
  • 2017-07-22 02:46:56
  • 369

C++需要GC吗?

或许这是一个非常大而且广泛的问题,这里涉及到了很多感性的问题,因为很多人讨论过这个问题,虽然得出了很大的结论说需要GC来辅助C++。首先说明的一点是,我是刚毕业出来的程序员,一直做着C++的开发工作,...
  • kelven2004
  • kelven2004
  • 2006-11-24 17:30:00
  • 1034

JAVA gc垃圾回收机制

amath321 发布于 4个月前,共有 0 条评论 一、GC概要   JVM堆相关知识     为什么先说JVM堆?     JVM的堆是Java对象的活动空间,程序中的类的对象从...
  • jiafu1115
  • jiafu1115
  • 2011-11-29 17:35:05
  • 62251

介绍Java GC种类,并更换 调优GC

      调整JVM GC(Garbage Collection),可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程...
  • roland101
  • roland101
  • 2008-03-21 17:19:00
  • 17509

6. GC 调优(工具篇) - GC参考手册

进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的工具, 以及如何获取原生数据。 后续的章节将对重要的派生指标(deri...
  • renfufei
  • renfufei
  • 2017-02-23 18:56:02
  • 5024

GC详解及Minor GC和Full GC触发条件总结

GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始...
  • YHYR_YCY
  • YHYR_YCY
  • 2016-09-17 22:09:26
  • 22060

浅谈C#的垃圾回收-关于GC、析构函数、Dispose、and Finalize

近日浏览Msdn,有一段很是费解,引于此处:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.Cod...
  • luyifeiniu
  • luyifeiniu
  • 2007-12-26 21:23:00
  • 3834

Major GC和Full GC的区别是什么?触发条件呢?

作者:RednaxelaFX 链接:http://www.zhihu.com/question/41922036/answer/93079526 来源:知乎 著作权归作者所有。商业转载请联系作者...
  • z69183787
  • z69183787
  • 2016-06-07 20:26:54
  • 6396

JVM GC 机制与性能优化

1 背景介绍 与C/C++相比,JAVA并不要求我们去人为编写代码进行内存回收和垃圾清理。JAVA提供了垃圾回收器(garbage collector)来自动检测对象的作用域),可自动把不再被使用的...
  • antony9118
  • antony9118
  • 2016-05-11 16:31:38
  • 7577
收藏助手
不良信息举报
您举报文章:再论C++之垃圾回收(GC)
举报原因:
原因补充:

(最多只允许输入30个字)