在Windows环境中有很多分配内存的方法,例如VirtualAlloc
,HeapAlloc
,malloc
和new
。
因此,它们之间有什么区别?
最佳答案
每个API都有不同的用途。完成内存处理后,每一项都要求您使用正确的释放/释放功能。
虚拟分配
低级Windows API,提供了很多选项,但主要用于相当特定情况下的人们。只能在较大的块中分配内存(编辑:不是4KB)。在某些情况下您需要它,但是当您处于这些情况之一时,您就会知道。最常见的一种是您是否必须直接与另一个进程共享内存。不要将其用于通用内存分配。使用VirtualFree
取消分配。
堆Alloc
分配所需的任何内存大小,而不是VirtualAlloc
较大的块。 HeapAlloc
知道何时需要调用VirtualAlloc
并自动为您调用。与malloc
相似,但仅适用于Windows,并提供了更多选项。适用于分配常规内存块。某些Windows API可能要求您使用它来分配传递给它们的内存,或使用其配套的HeapFree
释放它们返回给您的内存。
分配
分配内存的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
,可能会告诉您必须在特定情况下使用。