我想知道在Windows C编程中推荐哪种方法:使用malloc或Win32 HeapAlloc(可能是VirtualAlloc?)函数。

我已阅读MSDN 内存管理功能文章和关于malloc和HeapAlloc的MSDN文章,但他们没有说明应该使用哪一个以及在什么情况下使用。

有帮助吗?

解决方案

坚持使用malloc,除非你有令人信服的理由使用不同的东西。它将在OS内存分配原语的基础上实现,但是自己潜入该层并没有真正的优势。

一些API调用我认为需要从Windows堆分配一个内存块,但是当你遇到它们时就会知道。

或者如果你想做更高级的事情,比如使用共享内存,或者需要直接控制内存页面上的权限,那么你需要查看像VirtualAlloc这样的Windows API调用。

其他提示

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函数。 此外,如果您需要更改已分配内存的权限(例如:生成可执行文件等),则应使用VirtualAlloc,VirtualFree等函数。

您可以创建一个包装器并保留更改实现详细信息的选项。您甚至可以将这两个选项与您的代码进行比较,然后再决定。

与Rob不同,我走的是另一种方式......因为我选择针对WinAPI进行编码,所以我使用的是本机函数而不是C运行时函数,无论如何它们只是一个很薄的包装。

使用HeapAlloc,您可以为不同的任务/子系统分别使用堆。这可以简化大型应用程序的转储分析。

使用malloc,您只能使用一个堆,但是您可以获得CRT作者可能在OS HeapAlloc之上实现的一些分配优化。

除非你想实现自定义堆管理器(你自己的一组Heap *函数),否则去VirtualAlloc并不会给你太多买。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top