malloc()与HeapAlloc()

malloc()和HeapAlloc()有什么区别? 据我所知malloc从堆分配内存,就像HeapAlloc,对不对?

那么区别是什么呢?

谢谢!

你是对的,他们都从堆中分配内存。 但是有差异:

  • malloc()是便携式的,是标准的一部分。
  • HeapAlloc()不可移植,它是一个Windows API函数。

在Windows上,很可能malloc会在HeapAlloc之上实现。 我希望mallocHeapAlloc快。

HeapAllocmalloc更具灵活性。 特别是它允许你指定你希望从哪个堆分配。 这为每个进程提供了多个堆栈。

对于几乎所有的编码场景,您都可以使用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分配器。