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

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

本文已经迁移到: 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的规则easy不了多少,有时甚至让新接触该技术的程序猿感到畏惧。另外,引用计数的引入,出乎意料的产生了一个负作用:调试内存泄漏变得比原先困难多了。

     
    所以引用计数和智能指针实现的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简单、高效、easy控制。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119220.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月14日 上午9:00
下一篇 2021年11月14日 上午10:00


相关推荐

  • http://bdsmdvdtube.com/ 罪恶无处不在

    http://bdsmdvdtube.com/ 罪恶无处不在http://bdsmdvdtube.com/

    2022年7月1日
    26
  • 角度 弧度的转换_角度换算度分秒

    角度 弧度的转换_角度换算度分秒由数学关系已知 360度=2π弧度 =>180度= π*弧度 可证得一:1度=(π*弧度)/180 = 弧度/60 =>度=弧度*(π/180)   即60度=弧度*(60*π/180) 可证得二:1弧度=180/π=60度 =>弧度=度*(180/π) 即60弧度=度*(180/π)例1:cos(3

    2025年7月18日
    6
  • 网络编程学习笔记一:Socket编程

    网络编程学习笔记一:Socket编程“一切皆Socket!”话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。——有感于实际编程和开源项目研究。我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有

    2022年7月13日
    18
  • Linux虚拟机联网设置详细教程[通俗易懂]

    Linux虚拟机联网设置教程小伙伴们,你们在使用linux期间,是否遇到过需要联网的需求呢。这是一篇教你如何把Linux系统接入互联网的教程,本文介绍了两种联网的方式,适用的场景略有不同,每一种方法的优缺点会在文档中说明,请根据实际环境,自行选择,希望本文能帮助到你。一.环境介绍硬件:联想台式机软件:vmwareworkstation15pro操作系统:Centos7.9二.优缺点对比方法优点缺点桥接模式局域网内,与物理机处于同等位置,占用独立的局域网IP地址

    2022年4月12日
    64
  • osgb转3dtiles之数据篇

    osgb转3dtiles之数据篇前不久 终于对 osgb 以及 3dtiles 的数据结构有了足够的了解 成功地利用 FME 将 osgb 数据转换成了 3dtiles 数据 于是 我开心地决定先来写一下如何将 osgb 转换成 3dtiles 数据 为了让大家能够比较详细的了解这两个数据格式 该系列文章一共分为上下两篇 我将会从 osgb 与 3dtiles 的数据结构以及层级构建两个方面对其进行介绍 下篇仍在酝酿中 所以我们可以先将此篇作为单篇来看 本篇文章 仅讲解 osgb 与 3dtiles 的数据结构 不会涉及到层级等等的介绍 但为了能够成功的看到我们最终转换出来

    2026年2月18日
    3
  • django分页器的用法_django分页查询

    django分页器的用法_django分页查询前言当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面PageNumberPagination:基础分页器,性能略差LimitOffsetP

    2022年7月29日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号