malloc()与HeapAlloc()
malloc()和HeapAlloc()有什么区别? 据我所知malloc从堆分配内存,就像HeapAlloc,对不对?
那么区别是什么呢?
谢谢!
你是对的,他们都从堆中分配内存。 但是有差异:
-
malloc()
是便携式的,是标准的一部分。 -
HeapAlloc()
不可移植,它是一个Windows API函数。
在Windows上,很可能malloc
会在HeapAlloc
之上实现。 我希望malloc
比HeapAlloc
快。
HeapAlloc
比malloc
更具灵活性。 特别是它允许你指定你希望从哪个堆分配。 这为每个进程提供了多个堆栈。
对于几乎所有的编码场景,您都可以使用malloc
而不是HeapAlloc
。 虽然自从你标记你的问题C ++,我希望你使用new
!
实际上,malloc()(和其他C运行时堆函数)依赖于模块,这意味着如果从一个模块(即DLL)的代码中调用malloc(),则应该在同一模块的代码中调用free或者你可能会遭受一些非常糟糕的堆腐败(这已被logging在案)。 使用HeapAlloc()和GetProcessHeap()而不是malloc(),包括重载new和delete操作符来利用这些,允许你在模块之间传递dynamic分配的对象,而不必担心内存被分配一个模块被释放,一旦指向一个内存块的指针被传递到一个外部模块,则被释放到另一个模块的代码中。
使用Visual C ++,函数malloc()
或operator new
最终调用HeapAlloc()
。 如果你debugging了代码,你会发现函数_heap_alloc_base()
(在文件malloc.c
)正在调用return HeapAlloc(_crtheap, 0, size)
,其中_crtheap
是用HeapCreate()
创build的全局堆。
函数HeapAlloc()
在减less内存开销方面做得很好,每个分配至less有8字节的开销。 我看到的最大的是每个分配15字节,分配范围从1字节到100,000字节。 较大的块有更大的开销,但是占总分配的百分比仍然不到有效载荷的2.5%。
我不能评论性能,因为我没有使用定制的例程对HeapAlloc()
进行基准testing,但是就使用HeapAlloc()
的内存开销而言,开销非常低。
malloc
是C标准库(也是C ++标准库)中的一个函数。
HeapAlloc
是一个Windows API函数。
后者让你指定要分配的堆,我想可以避免在不同线程中分配请求的序列化(注意HEAP_NO_SERIALIZE
标志)。
干杯&hth。,
另外,你可以参考:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366705(v=vs.85).aspx
这意味着你可以启用由WinApi内存分配器pipe理的HEAP的某些function,例如“HeapEnableTerminationOnCorruption”。
据我所知,它使一些基本的堆溢出保护,可能被视为您的应用程序在安全性方面的附加价值。
(例如,我宁愿崩溃我的应用程序(作为应用程序所有者),而不是执行任意代码)
其他的一点是,它可能在发展的早期阶段是有用的,所以你可以在进入生产之前记住问题。
这就是MS要说的: http : //msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx
到目前为止所提到的一件事情是:“malloc函数具有运行时间依赖性的缺点,新操作符具有编译器依赖性和语言依赖性的缺点。
另外,“如果内存不能被分配,可以指示HeapAlloc引发exception”
所以如果你想让你的程序运行任何CRT,或者根本没有CRT,你可以使用HeapAlloc。 也许只有那些会做这种事的人才会成为恶意软件的作者。 另一个用法可能是如果你正在编写一个内存密集型的应用程序,并且使用特定的内存分配/使用模式,那么你宁愿写自己的堆分配器,而不使用CRT分配器。