我想知道在 Windows C 编程中推荐哪种方法:使用 malloc 或 Win32 HeapAlloc(可能是 VirtualAlloc?)函数。
我已经阅读了 MSDN内存管理函数文章和有关 malloc 和 HeapAlloc 的 MSDN 文章,但他们没有说明应该使用哪一个以及在什么情况下使用。
坚持使用 malloc ,除非您有令人信服的理由使用不同的东西。它将根据操作系统内存分配原语在底层实现,但自己深入到该层并没有真正的优势。
我相信一些 API 调用需要从 Windows 堆分配的内存块,但是当你遇到它们时你就会知道。
或者如果你想做一些更高级的事情,比如使用共享内存,或者需要直接控制内存页面的权限,那么你需要查看 Windows API 调用,比如 VirtualAlloc。
如果您确实有大量数据要处理,或者您无论如何都需要费心创建自己的内存管理器,VirtualAlloc 和朋友可以为您提供一点优势。
否则,使用 malloc() 会更容易,当然也更便携。
VirtualAlloc 有一个称为 MEM_RESET 的漂亮功能,它使内存块中的数据无效,但保持分配状态。这意味着如果它被分页到磁盘,Windows 将不会在您下次访问它时将其分页。如果您有许多可能突然变得不必要的数据,那很好,但是您很快就会有其他东西来填满缓冲区。
它还区分保留地址空间和实际请求内存。如果你有充分的理由去解决所有这些麻烦,那里有一些不错的东西。
还有一件事:malloc() 保证是可移植的(至少对于任何 ANSI-C 实现)并且更优雅。
在某些情况下使用 HeapAlloc 等函数,HeapFree 会让您的生活更轻松。一个例子是:一个大型应用程序,您需要在一个模块中分配内存(例如在 library1.dll 中)并在主模块中释放该内存(例如 program.exe)。如果您使用 HeapAlloc、HeapResize 和 HeapFree 函数,这可以安全地完成,但不能使用 C 运行时库(例如 malloc、free、resize)完成。
但是:如果你没有充分的理由,你应该坚持使用 malloc/free/resize 函数。此外,如果您需要更改分配内存的权限(例如:使 if 可执行等),您应该使用 VirtualAlloc、VirtualFree 等函数。
您可以制作一个包装器并保留更改实现细节的选项。您甚至可以将这两个选项与您的代码进行比较,然后再决定。
与 Rob 不同,我选择了另一种方式……因为我选择针对 WinAPI 进行编码,所以我使用本机函数而不是 C 运行时函数,反正它们只是围绕它们的一个薄包装。
使用 HeapAlloc,您可以为不同的任务/子系统拥有单独的堆。这可以简化大型应用程序的转储分析。
使用 malloc,您只能使用一个堆,但您会获得一些 CRT 作者可能在 OS HeapAlloc 之上实现的分配优化。
除非您想实现自定义堆管理器(您自己的一组 Heap* 函数),否则使用 VirtualAlloc 不会给您带来太多好处。