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

使用智能指针(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++/CLI(Microsoft的托管C++)
    • http://www.hpl.hp.com/personal/Hans_Boehm/gc/ (不少人用这个GC来进行开发)
    • http://www.devarticles.com/c/a/Cplusplus/A-Simple-Garbage-Collector-for-C-plus-plus/
    • http://cybertiggyr.com/gene/garbage-collection-cpp/
  • 评价:如果你的系统很单纯,采用这个是不错的主意。因为这意味着你的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)

  • 代码与文档:

    • C++内存管理变革
    • AutoFreeAlloc(最袖珍的垃圾回收器
    • boost::object_pool (注意,boost::pool不属于gc allocator,而只能说属于allocator)
    • 待续...
  • 评价:半自动的垃圾回收,比GC简单、高效、容易控制。

再论C++之垃圾回收(GC)相关推荐

  1. 垃圾回收(GC)浅谈

    关于内存 计算机通过两个机制,去实现内存的高效使用. 第一种机制是虚拟内存.硬盘的容量其实是远远大于内存的(RAM),虚拟内存会在内存不足的时候,把不经常访问的内存的数据写到硬盘里.虽然说硬盘容量比较 ...

  2. python进阶19垃圾回收GC

    原创博客链接:python进阶19垃圾回收GC 垃圾收集三大手段 一.引用计数(计数器) Python垃圾回收主要以引用计数为主,分代回收为辅.引用计数法的原理是每个对象维护一个ob_ref,用来记录 ...

  3. python垃圾回收离职_垃圾回收gc.md

    垃圾回收gc python的垃圾收回机制不想c和c++是开发者自己管理维护内存的,python的垃圾回收是系统自己处理的,所以作为普通的开发者,我们不需要关注垃圾回收部分的内容,如果想要深层次理解py ...

  4. 垃圾回收GC经典算法

    目录 垃圾回收GC(Garbage Collection) 1.什么是垃圾 2.为什么要有GC 经典的GC算法 1.基本的一些概念 2.标记清除算法(Mark and Sweep) 3.复制法(cop ...

  5. 第十五章: 菱悦 -垃圾回收GC详解

    第 15章 垃圾回收GC详解 文章目录 第 15章 垃圾回收GC详解 1.System.gc() 的理解 1.1.System.gc() 方法 1.2.不可达对象回收行为 2.内存溢出与内存泄漏 2. ...

  6. java using idispose_c# 垃圾回收(GC)优化

    GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理.其对系统性能的影响是不可小觑的.今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实 ...

  7. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能****

    前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程序中 ...

  8. IBM JDK(J9)垃圾回收(GC)策略

    在IBM JDK 1.5之后,采用了如下的垃圾回收GC策略: 针对吞吐量进行优化 -Xgcpolicy:optthruput(可选) 默认策略.对于吞吐量比短暂的 GC 停顿更重要的应用程序,通常使用 ...

  9. .net C# 堆 栈 垃圾回收 GC

    .NET C# .NET C# .NET C# .NET C# .NET C# .NET C# .NET C# 栈 堆 垃圾回收 GC #1 尽管在.NET framework下我们并不需要担心内存管 ...

最新文章

  1. mysql导入sql文件过大或连接超时的解决的方法
  2. 基于Bootstrap、Jquery的自适应导航栏
  3. Almost sorted interval
  4. php获取类的熟悉,php如何获取类的所有方法
  5. Java语言实现简单FTP软件------源码放送(十三)
  6. According to TLD or attribute directive in tag file, attribute value does not accept any expressions
  7. 解决:XCODE 4.2 无法连接SVN,提示:Unable to load revisions
  8. vue项目中运用webpack动态配置打包多种环境域名
  9. QML for Android通过ScreenRecorder录制屏幕并保存为本地视频
  10. 用Blazor技术封装G2Plot实现Charts组件
  11. Spring Data Solr教程:配置
  12. C++ Prime:sizeof运算符
  13. 【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作
  14. QComboBox样式表
  15. python滑稽脸代码_如何用python进行简单的syn flood滑稽(带代码@)
  16. 计算机学院公众号头像制作,公众号头像需要原创吗?公众号头像怎么制作?
  17. 关于iconfont字体图标在IE上无法显示的问题
  18. VScode输入英文感叹号!没有提示模板!!
  19. ArcGIS的符号选择器(Symbol Selector)为空的解决办法
  20. ava.lang.IllegalArgumentException: At least one base package must be specified at org.springframewo

热门文章

  1. 数据结构之结构体复习
  2. 中国红色旅游消费大数据报告(2021)
  3. 2021下午茶数字经济蓝皮书
  4. 2020教育OMO模式落地应用研究报告
  5. 面试题,作为产品经理你是如何应对需求变更的?
  6. 彻底理解python递归_Python开发之-Python递归图示理解
  7. 前端 验证码隐藏怎么实现_Python爬虫教程:200行代码实现一个滑动验证码
  8. 作者:夏梓峻(1986-),男,国家超级计算天津中心应用研发部副部长。
  9. 【Windows】Windows10基于VMware安装CentOS7的全面教程
  10. 【Python】Matplotlib绘制极坐标散点图