Windows环境下分配内存的方法有很多,如VirtualAlloc
、HeapAlloc
、malloc
、new
.
那么,它们之间有什么区别呢?
最佳答案
每个 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/