`
阿尔萨斯
  • 浏览: 4107806 次
社区版块
存档分类
最新评论

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

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

使用智能指针(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简单、高效、容易控制。



分享到:
评论

相关推荐

    AutoGC简单的C++垃圾回收器,基于多线程。

    这不是智能指针!这是内存集中管理的GC器,基于RAII。AutoGC简单的C++垃圾回收器,基于c++11标准的多线程。这是源码和lib+示例。

    C++垃圾回收器

    在C++程序中进行垃圾回收的代码,使用标记-回收算法,支持多继承,对象数组的回收。详细的介绍在我的blog http://blog.csdn.net/winux/archive/2007/09/01/1768777.aspx

    gc.zip_unix c++_垃圾回收器

    unix-like 系统下c实现的垃圾回收器

    gc.tar.gz_garbage_garbage collection_回收站_垃圾回收

    著名的C/C++垃圾回收站

    python垃圾回收机制(GC)原理解析

    这篇文章主要介绍了python垃圾回收机制(GC)原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下  今天想跟大家分享的是关于python的垃圾回收机制,虽然本人...

    API for Boehm Garbage Collector DLL

    C++的自动垃圾回收库早就有了几个,商业和非商业的都有。不过delphi的好像就没见过了。 最近在搜索delphi自动垃圾回收技术的时候在borland的网站上看到了在delphi中使用自动垃圾回收的方法。用过一个接口文件,采用...

    《C++编程艺术》教程+代码

    第2章 简单的C++垃圾回收器 5 2.1 两种内存管理方法的比较 5 2.1.1 手工内存管理的优缺点 6 2.1.2 垃圾回收的优缺点 6 2.1.3 两种方法都可以使用 7 2.2 在C++中创建垃圾回收器 7 2.3 选择垃圾回收的算法 8 2.3.1 ...

    c#如何用好垃圾回收机制GC

    一、为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1、为对应的资源分配内存 2、初始化内存 3、使用资源 4、清理资源 5、释放内存 应用程序对资源(内存使用)管理的方式,常见的一般有如下几种: 1...

    golang的gc回收针对堆还是栈?变量内存分配在堆还是栈?

    2.堆(操作系统): 一般由程序员分配释放,例如在c/c++中,在golang,java,python有自动的垃圾回收机制 我们都知道变量占有内存,内存在底层分配上有堆和栈。 值类型变量的内存通常是在栈中分配 引用类型变量的...

    JAVA中对GC的理解

    GC是什么,作用有哪些 C++与java之间内存管理的区别 标记垃圾的算法有哪些 回收垃圾的算法有哪些 垃圾回收器有哪些

    C#内存管理变化.pdf

    尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识。明白内存管理的基本行为将有助于我们解释我们程序中变量是...

    Java 垃圾回收新算法刍探

    由Java语言与C/C++对象在内存管理方式的不同,引出了Java语言的优势技术——垃圾处理技术。通过对GC工作原理的阐述及对一些传统的垃圾收集器的分析,提出了一种新的垃圾处理算法,一定程度上改善和提高了Java垃圾...

    C++ garbage collector-开源

    GC ++是一个用于C ++的小型便携式跟踪标记清除垃圾收集库。 它需要符合标准的C ++编译器和pthreads支持。

    CLR编程,CLR 原理,CLR 内幕

    CLR提供的堆管理和整理机制被称作垃圾回收(garbage collection)-- 垃圾即被抛弃的变量和对象,CLR管理的堆被称为可回收垃圾的堆(garbage-collected heap)。在C++/CLI程序中,使用gcnew运算符而非new运算符分配内存。...

    程序员为什么还要刷题-gc-in-50-lines:用50行C++编写的标记和清除垃圾收集器示例

    程序员常刷题GC 50 行 杰森·奥伦多夫2014 年 8 月 16 日 介绍 程序中的所有内容都必须以某种方式在内存中表示:代码、数据、参数、变量。 为所有这些东西找到一个位置并使其井井有条的任务称为内存管理。 内存管理...

    C# vs C++ 全局照明渲染性能比试

     赵姐夫在此回覆认为,C#比C/C++慢,主要在于.Net平台的垃圾回收(garbage collection, GC)机制。若是计算密集型应用,C#和C++产生的原生代码,速度应该相差不大。我对此半信半疑。想到之前看过一个用99行C++代码...

    java基础学习笔记 java整合技术 java工具类.rar

    健壮性:java的健壮性与自动垃圾回收机制有关,自动垃圾回收机制简称GC机制,java语言运行过程中产生的垃圾是自动回收的,不需要程序员关心。 可移植性:java程序可以做到一次编译,到处运行。在Windows操作系统上...

    java内存泄漏

    Java语言对内存管理做了自己的优化,这就是垃圾回收机制。Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由GC(garbage collection)负责自动回收不再使用的内存。  上面是Java内存管理机制...

    android的GC内存泄露问题

    不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露。其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了...

Global site tag (gtag.js) - Google Analytics