再论C++之垃圾回收(GC)
使用智能指针(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)
- 代码与文档:
- C++内存管理变革
- AutoFreeAlloc(最袖珍的垃圾回收器)
- boost::object_pool (注意,boost::pool不属于gc allocator,而仅仅能说属于allocator)
- 待续...
- 评价:半自己主动的垃圾回收,比GC简单、高效、easy控制。
再论C++之垃圾回收(GC)的更多相关文章
- 从C#垃圾回收(GC)机制中挖掘性能优化方案
GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理.其对系统性能的影响是不可小觑的.今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实 ...
- Java 垃圾回收(GC) 泛读
Java 垃圾回收(GC) 泛读 文章地址:https://segmentfault.com/a/1190000008922319 0. 序言 带着问题去看待 垃圾回收(GC) 会比较好,一般来说主要 ...
- 类装饰器,元类,垃圾回收GC,内建属性、内建方法,集合,functools模块,常见模块
'''''''''类装饰器'''class Test(): def __init__(self,func): print('---初始化---') print('func name is %s'%fu ...
- 性能测试三十五:jvm垃圾回收-GC
垃圾回收-GC 三个问题 哪些内存需要回收? 什么时候回收? 如何回收? YoungGC和FullGC: 新生代引发的GC叫YoungGC 老年代引发的GC叫FullGC FullGC会引起整个Jvm ...
- 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- JVM学习——垃圾回收GC(学习过程)
JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...
- 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配
垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- 修改Tomcat的jvm的垃圾回收GC方式为CMS
修改Tomcat的jvm的垃圾回收GC方式 cp $TOMCAT_HOME/bin/catalina.sh $TOMCAT_HOME/bin/catalina.sh.bak_20170815 vi $ ...
- 垃圾回收GC:.Net自己主动内存管理 上(三)终结器
垃圾回收GC:.Net自己主动内存管理 上(三)终结器 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主 ...
- 垃圾回收GC
每种语言都有自己的垃圾回收机制.接下来我们来讲一下python的垃圾回收机制. 小整数对象池:python对小整数的定义为[-5,257),这些整数对象是提前建立好的,不会被垃圾回收.单个字母也一 ...
随机推荐
- POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)
题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...
- MinGW-MSYS Bundle Win32编译ffmpeg 生成DLL并加入X264模块
组件资源站点 1)MinGW-MSYS Bundle http://sourceforge.net/projects/mingwbundle/files/ 2)yasm汇编器 http://yasm. ...
- Python之Selenium的爬虫用法
Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是 Selenium 的竞争对手).也就是说 Sel ...
- gtk+学习笔记(四)
今天看了下单选按钮的设置,实现起来还是挺简单的,就是自己太不熟练 radio=gtk_radio_button_new_with_label(NULL,"a"); //第一次创建单 ...
- PHP性能调优---php-fpm - 启动参数及重要配置详解
约定几个目录/usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini 一,php-fpm ...
- appium----【Mac】address already in user 127.0.0.1:4725,端口被占用的查找与kill进程
报错截图示例: 解决方法: Mac: lsof -i tcp:4723 #查看端口号 sudo kill -9 29443 #杀死进程 Windows: netstat -aon|fi ...
- Entity Framework Code First 在Object Join Linq查询时出现全表查询的语句。
最近一个项目,使用微软的Entity Framework的ORM框架的项目,部署到现场后,出现了系统缓慢,多个客户端的内存溢出崩溃的问题. 打开了SQL Server Profiler(SQL Ser ...
- 容器计划任务大坑:在alpine容器里,想用非root帐号执行crontab任务
我只能说抱歉,我前前后后测试了七天, 将自己预想的配置错误,一个一个去验证. 非root帐号在alpine容器里执行crontab任务,还是失败, 输出依旧是一片空白~ stackoverflow里, ...
- LoadRuner常见错误
LoadRuner常见错误 一.Step download timeout (120 seconds) 这是一个经常会遇到的问题,解决得办法走以下步骤: 1. 修改run time setting中的 ...
- JAVAEE——宜立方商城03:商品类目选择、Nginx端口或域名区分虚拟机、Nginx反向代理、负载均衡、keepalived实现高可用
1. 学习计划 第三天: 1.商品类目选择(EasyUI的tree实现) 2.图片上传 a) 图片服务器FastDFS(Nainx部分) 2. 商品类目选择 2.1. 原型 2.2. 功能分析 展示商 ...