在Windows环境中有很多分配内存的方法,例如VirtualAllocHeapAllocmallocnew

因此,它们之间有什么区别?

最佳答案

每个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,可能会告诉您必须在特定情况下使用。

10-04 13:47