malloc()和HeapAlloc()之间有什么区别?据我了解,malloc从堆中分配内存,就像HeapAlloc一样,对吗?
那么它们有什么不同呢?
实际上,malloc()(以及其他C运行时堆函数)是模块依赖的,这意味着如果你在一个模块的代码中调用malloc()(例如DLL),那么你应该在同一模块的代码中调用free(),否则你可能会遭受一些相当严重的堆破坏(这已经有充分的文档记录)。使用HeapAlloc()和GetProcessHeap()代替malloc(),包括重载new和delete操作符来使用它们,可以让你在动态分配对象之间传递参数而不必担心内存损坏,即使在一个模块的代码中分配了内存并在另一个模块的代码中释放了指向内存块的指针。
malloc()
是可移植的,是标准库的一部分。HeapAlloc()
不是可移植的,它是Windows API函数。malloc
很可能是基于HeapAlloc
实现的。我希望malloc
比HeapAlloc
更快。
HeapAlloc
比malloc
更具灵活性。特别是它允许您指定要从哪个堆中分配内存。这适用于每个进程的多个堆的情况。
对于几乎所有的编码场景,您都应该使用malloc
而不是HeapAlloc
。尽管由于您标记了您的问题为C ++,我预计您将使用new
!malloc
是在HeapAlloc
的基础上实现的,那么它怎么可能比HeapAlloc
更快呢? - dan04malloc
可能会实现进一步的子分配模式。 - David Heffernan使用Visual C++,函数malloc()
或运算符new
最终调用HeapAlloc()
。如果您对代码进行调试,将找到文件malloc.c
中的函数_heap_alloc_base()
调用return HeapAlloc(_crtheap, 0, size)
,其中_crtheap
是使用HeapCreate()
创建的全局堆。
函数HeapAlloc()
在最小化内存开销方面做得很好,每个分配的最小开销为8字节。我见过的最大开销为每个分配15字节,适用于从1字节到100,000字节的分配。更大的块有更大的开销,但作为有效负载的总分配的百分比仍然低于2.5%。
我无法评论性能,因为我没有使用自定义程序测试过HeapAlloc()
,但就使用HeapAlloc()
的内存开销而言,开销非常低。
HeapAlloc
,你确认吗? - v.oddoumalloc
是C标准库(也包括C++标准库)中的函数。
HeapAlloc
是Windows API函数。
后者允许您指定要分配内存块的堆,这对于避免在不同线程中序列化分配请求可能很有用(注意 HEAP_NO_SERIALIZE
标志)。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366705(v=vs.85).aspx
这意味着您可以启用WinApi内存分配器管理的HEAP的某些功能,例如“HeapEnableTerminationOnCorruption”。malloc是由C运行时库(CRT)导出的函数,其特定于编译器。
C运行时库DLL名称随Visual Studio版本而变化。
HeapAlloc函数由位于Windows文件夹中的kernel32.dll导出。
这是微软对此的说法:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx
迄今为止,有一件事情没有被提到:“malloc函数的缺点是运行时依赖性。new操作符的缺点是编译器依赖性和语言依赖性。”
另外,“HeapAlloc可以被指示在无法分配内存时引发异常”。
因此,如果您希望您的程序能够在任何CRT上运行,或者可能根本不使用CRT,则应使用HeapAlloc。也许只有恶意软件编写者才会这样做。另一个用途可能是,如果您正在编写一个非常占用内存的应用程序,并且具有特定的内存分配/使用模式,您可能会编写自己的堆分配器,而不是使用CRT的堆分配器。
malloc()
是可移植的,但当你需要移动对象并涉及到DLL时,你需要使用堆(Heap)。对于Windows开发者来说,建议使用堆,并为堆编写自定义STL分配器。 - CodeAngry