Windows内存体系(7)--使用std::string跨MT模块传参

前面的Windows内存体系(6)--跨模块内存分配释放文章解释了跨 MT 模块分配的内存相互释放为什么会崩溃的问题,本文介绍如何解决该问题。

Windows编程

Windows内存体系(6)--跨模块内存分配释放

在《Windows核心编程 第五版》第19章 DLL基础(511页)中给出了一个建议: “当一个 MT 版本的模块如果提供一个内存分配函数的时候,它必须同时提供另一个用来释放内存的函数。”。 说得更加直白一点就是,“对于 MT 的模块,不要跨模块进行内存释放。”。但是核心编程这本书上面没有具体分析原因,本文就来分析具体的原因。

Windows编程

Windows内存体系(5)--堆

一、为什么要使用堆 (Heap)?应用程序虽然可以使用页面粒度的函数(如VirualAlloc)来分配一个最小为4KB或8K的内存块,但是很多时候我们并不需要分配这么大的内存块,我们可能只想分配 1K,2K 的内存块,那么这个时候无论从内存的使用率,还是从性能的角度来看,再分配这么大的一个内存区域显然不是最优的了。 为了满足这种需求,Windows 提供了一个被称为“堆管理器”的组件,它负责管理大内存区域中的内存分配,这些大内存区域就是通过一些页面粒度的内存分配函数(如VirualAlloc)来预定(reserve)的。 堆管理器中的分配粒度相对比较小:在32位系统上是8字节,在64位系统上是16字节。 堆管理器已经被 Windows 系统精心设计,在这些小内存分配的情况下会进行内存使用率和性能两个方面的优化。

Windows编程