gpt4 book ai didi

winapi - VirtualAlloc 和 HeapAlloc 有什么区别?

转载 作者:IT王子 更新时间:2023-10-28 23:28:21 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com