■ 前言
本文内容并非原创,仅仅是对一些现有思路进行整理,使其为己所用。
本文的最终目标是制定一套替代malloc&free的内存管理方案。同时也为接下来在C中践行OOP提供一些基础资源。
直接使用malloc&free的内存管理,在很多情况下都能满足需求(这些情况下不去考虑替代案或许反而是正解),但仍有以下一些遗憾:
1. 使用malloc所获取的内存空间,其大小不可变,不具扩展性。解决方案大致有两种:其一是使用realloc,但这样会产生副作用,具体将在第一节“realloc方案”中讨论;其二是对多次malloc所获取的内存块,按某种方式进行管理,使其从用户视点保持为一个整体。
2. 使用malloc所获取的内存空间,其释放时机并不总是明确的。一般来说为了防止内存泄露,都需要小心翼翼的梳理malloc与对应的free之间的关系。即使如此,在一些执行时间长,对象生存周期跨度大,依赖关系复杂的情况下,也会出现意外的困境。
3. malloc作为泛用内存管理方案,其注重的是在频繁分配释放大小不定的空间时,也不会使内存使用效率降低。但在有些情况下,更为频繁的是分配释放固定大小的结构体。此时,malloc的开销就略显昂贵了。(针对这些情况,比较常见的方案是预先分配较大的结构体数组。)
本文并不打算一次性提出方案的最终形态,而将通过逐步化解这些遗憾以求更好的整理思路。
以下是内容目录:
■ realloc方案
■ 泛用内存池(第一阶段)
■ 泛用内存池(第二阶段)
■ 引用计数
■ 泛用内存池(最终形态)
本文内容并非原创,仅仅是对一些现有思路进行整理,使其为己所用。
本文的最终目标是制定一套替代malloc&free的内存管理方案。同时也为接下来在C中践行OOP提供一些基础资源。
直接使用malloc&free的内存管理,在很多情况下都能满足需求(这些情况下不去考虑替代案或许反而是正解),但仍有以下一些遗憾:
1. 使用malloc所获取的内存空间,其大小不可变,不具扩展性。解决方案大致有两种:其一是使用realloc,但这样会产生副作用,具体将在第一节“realloc方案”中讨论;其二是对多次malloc所获取的内存块,按某种方式进行管理,使其从用户视点保持为一个整体。
2. 使用malloc所获取的内存空间,其释放时机并不总是明确的。一般来说为了防止内存泄露,都需要小心翼翼的梳理malloc与对应的free之间的关系。即使如此,在一些执行时间长,对象生存周期跨度大,依赖关系复杂的情况下,也会出现意外的困境。
3. malloc作为泛用内存管理方案,其注重的是在频繁分配释放大小不定的空间时,也不会使内存使用效率降低。但在有些情况下,更为频繁的是分配释放固定大小的结构体。此时,malloc的开销就略显昂贵了。(针对这些情况,比较常见的方案是预先分配较大的结构体数组。)
本文并不打算一次性提出方案的最终形态,而将通过逐步化解这些遗憾以求更好的整理思路。
以下是内容目录:
■ realloc方案
■ 泛用内存池(第一阶段)
■ 泛用内存池(第二阶段)
■ 引用计数
■ 泛用内存池(最终形态)