winapi - VirtualAlloc 和 HeapAlloc 有什么区别?

标签 winapi memory heap-memory new-operator

Windows环境下分配内存的方法有很多,如VirtualAllocHeapAllocmallocnew.

那么,它们之间有什么区别呢?

最佳答案

每个 API 都有不同的用途。每一个还要求您在使用完内存后使用正确的释放/释放功能。

虚拟分配

一种低级的 Windows API,它提供了许多选项,但主要对处于相当特定情况的人有用。只能在(编辑:不是 4KB)更大的 block 中分配内存。在某些情况下您需要它,但是当您处于其中一种情况时您会知道。最常见的一种情况是您必须直接与另一个进程共享内存。不要将其用于通用内存分配。使用 VirtualFree 解除分配。

堆分配

分配您要求的任何大小的内存,而不是比 VirtualAlloc 大块。 HeapAlloc 知道何时需要调用 VirtualAlloc 并自动为您执行此操作。与 malloc 类似,但仅适用于 Windows,并提供了更多选项。适合分配一般的内存块。某些 Windows API 可能要求您使用它来分配您传递给它们的内存,或使用它的配套 HeapFree 来释放它们返回给您的内存。

malloc

分配内存的C方式。如果您使用 C 而不是 C++ 编写,并且希望您的代码可以在例如Unix 计算机也是如此,或者有人特别说您需要使用它。不初始化内存。适用于分配一般内存块,如 HeapAlloc。一个简单的 API。使用 free 解除分配。 Visual C++ 的 malloc 调用 HeapAlloc

C++ 分配内存的方式。如果您使用 C++ 编写,则更喜欢这个。它也将一个或多个对象放入分配的内存中。使用 delete 解除分配(或 delete[] 用于数组)。 Visual Studio 的 new 调用 HeapAlloc,然后可能会初始化对象,具体取决于您如何调用它。

在最近的 C++ 标准(C++11 及更高版本)中,如果您必须手动使用 delete,那么您做错了,应该使用 智能指针unique_ptr 代替。从 C++14 开始,new 也可以这样说(替换为 make_unique() 等函数)。


还有一些其他类似的函数,例如 SysAllocString,您可能会被告知必须在特定情况下使用它们。

关于winapi - VirtualAlloc 和 HeapAlloc 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/872072/

相关文章:

c++ - 应用程序配置不正确错误 C++

windows - 如何创建名称大小写不同的目录? (区分大小写的 CreateDirectory 函数)

c++ - 如何获取AppData路径

C指令地址

linux - 如何查找 Linux 中存在的堆大小?

c++ - Vista/Win 7 SDK bufferoverflowu.lib 链接错误

c - 如何访问已知内存地址的内容?

c - 以下声明的大小是多少?

linux - Linux 上响应 free 命令的可用内存和可用内存是什么?

java - 使用 java 11 编译后的堆外泄漏