C++内存管理变革(3):另类内存管理

最简单的C++/Java程序

最简单的Java程序:

class Program
{
public static void main()
{
new int;
}
}

对应的C++程序:

void main()
{
new int;
}

我想没有一个Java程序员会认为上面的Java代码存在问题。但是所有严谨的C++程序员则马上指出:上面这个C++程序有问题,它存在内存泄漏。但是我今天想和大家交流的一个观念是:这个C++程序没有什么问题。

DocX程序的内存管理

DocX是我开发的一个文档撰写工具。这里有关于它的一些介绍。在这一小节里,我要谈谈我在DocX中尝试的另类内存管理方法。

DocX的总体流程是:

读入一个C++源代码(或头)文件(.h/.c/.hpp/.cpp等),分析其中的注释,提取并生成xml文档。

通过xslt变换,将xml文档转换为htm。

分析源代码中的所有include指令,取得相应的头文件路径,如果某个头文件没有分析过,跳到1反复这些步骤。

最后所有生成的htm打包生成chm文件。

一开始,我象Java/C#程序员做的那样,我的代码中所有的new均不考虑delete。当然,它一直运作得很好,直到有一天我的文档累计到了一定程度后。正如我们预见的那样,DocX程序运行崩溃了。

那么,怎么办呢?找到所有需要delete的地方,补上delete?

这其实并不需要。在前面,我给大家介绍了AutoFreeAlloc(参见《C++内存管理变革(2):最袖珍的垃圾回收器》),也许有人在嘀咕,这样一个内存分配器到底有何作用。——那么,现在你马上可以看到它的典型用法之一了:

对于我们的DocX崩溃后,我只是做了以下改动:

加一个全局变量:std::AutoFreeAlloc alloc;

所有的new Type(arg1, arg2, …, argn),改为STD_NEW(alloc, Type)(arg1, arg2, …, argn);

所有的new Type[n],改为STD_NEW_ARRAY(alloc, Type, n);

每处理完一个源代码文件时,调用一次alloc.clear();

搞定,自此之后,DocX再也没有内存泄漏,也不再有遇到内存不足而崩溃的情形。

时间: 2024-11-03 23:30:38

C++内存管理变革(3):另类内存管理的相关文章

C++内存管理变革(4): boost::object_pool

言归正传.我们在内存池(MemPool)技术详解已经介绍了boost::pool组件.从内存管理观念的变革来看,这是是一个传统的MemPool组件,尽管也有一定的改进(但只是性能上的改进).但boost::object_pool不同,它与我在C++内存管理变革强调的观念非常吻合.可以认为,boost::object_pool是一种不通用的gc allocator组件. 我已经多次提出gc allocator的概念.这里仍然需要强调一下,所谓gc allocator,是指具垃圾回收能力的alloc

如何合理管理win7电脑的内存

  不知道大家在操作win7电脑的时候,会不会出现这样的情况,严重的内存分布不合理,有的磁盘占用了很多的空间,但是有的磁盘却十分的空旷,其实这就是一种磁盘空间运用不合理的状况,反之,如果咱们可以将磁盘空间更合理的布局使用,更合理的管理,那么就更能体现ghost win7的强大性.下面,咱们就来说说如何合理的管理win7电脑的内存吧! 1.在说到win7电脑内存合理管理之前,我们还需要涉及一个概念,那便是虚拟内存了,虚拟内存是相对物理内存而言的,也是咱们需要预留的一部分内存,因为足够大的虚拟内存可

深入理解计算机系统-之-内存寻址(三)--分段管理机制(段描述符,段选择子,描述符表)

逻辑地址-=>线性地址-=>物理地址 前面我们提到了当使用80x86微处理器时,有三种不同的地址: 逻辑地址(logical address):包含在机器语言指令中用来指定一个操作数或一条指令的地址.这个寻址方式在80x86著名的分段结构中表现得尤为具体,它促使MS-DOS或Windows程序员把程序分成若干段.每一个逻辑地址都由一个段(segment)和偏移量(offset或displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距离. 线性地址(linear addres

bbs段-C语言内存管理,BBS段内存分配

问题描述 C语言内存管理,BBS段内存分配 #include<stdio.h> int a; int b; int c=1; int d=1; void main(){ printf("%dn",sizeof(int)); printf("%p,%p,%p,%pn",&a,&b,&c,&d); } 运行结果: 4 00404090,004040A0,00402000,00402004 想要问的是:程序是不是给变量a,b分配

Linux内存管理:高端内存的映射方式

高端内存是指物理地址大于 896M 的内存. 对于这样的内存,无法在"内核直接映射空间"进行映射. 为什么? 因为"内核直接映射空间"最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 1G 的物理内存,无能为力. 实际上,"内核直接映射空间"也达不到 1G, 还得留点线性空间给"内核动态映射空间" 呢. 因此,Linux 规定"内核直接映射空间" 最多映射 896M 物理内存. 对于高端内

c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理

windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 GetCurrentDirectory();//获取当前工作目录 SetCurrentDirectory();//修改当前工作目录 CreateFile/ReadFile/WriteFile/GetFileSize/SetFilePointer //返回文件大小的低32位 DWORD GetFil

Linux内存管理-高端内存(一)

高端内存是指物理地址大于 896M 的内存.对于这样的内存,无法在"内核直接映射空间"进行映射. 为什么? 因为"内核直接映射空间"最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 1G 的物理内存,无能为力. 实际上,"内核直接映射空间"也达不到 1G, 还得留点线性空间给"内核动态映射空间" 呢. 因此,Linux 规定"内核直接映射空间" 最多映射 896M 物理内存. 对于高端内存

大数据与公共管理变革

公共管理是公权力的行使者决定公共资源在公共领域配置的过程.公权力配置公共资源并不是随意性的,科学配置公共资源必须建立在对公共领域详细了解的基础上:否则,公共资源的配置就会出现扭曲,最终导致公共资源的浪费和无效配置.传统的公共管理是借助于历史经验的反复比较,正所谓"以史为鉴,可知兴替".今天虽然历史纵向的比较仍然可以获得经验,但这并非唯一的方法,甚至可以说是一种陈旧的方法论.新的方法是基于大数据的公共管理,大数据将带来公共管理的重大革命. 一.大数据的内涵和特征 "大数据&qu

烽火通信“十二五”跨越式发展 依靠管理变革实现“增量产出”

深化管理变革,破解发展瓶颈,在增量发展的新征程中实现跨越式发展--催人奋起的"十二五",烽火写下波澜壮阔的答卷. 奋力摆脱行业洗牌冲击,加快产业结构优化升级,向着新的高度发起冲刺--跌宕起伏的"十二五",烽火写下充满希望的答卷. 在变革中蜕变,在转型中增长,在逆境中突破."十二五",面对国内外各种严峻的挑战,烽火的航船始终在平稳快速发展中破浪前进,营收从70亿元到100亿元.170亿元,站在了崭新的起点上. 从今天开始,本报将推出烽火通信&quo