TCS*_*TCS 58 c++ malloc winapi
malloc()和HeapAlloc()有什么区别?据我所知,malloc从堆中分配内存,就像HeapAlloc一样,对吧?
那么区别是什么呢?
谢谢!
小智 78
实际上,malloc()(和其他C运行时堆函数)是模块相关的,这意味着如果从一个模块(即DLL)调用代码中的malloc(),那么你应该在同一个模块的代码中调用free()或者你可能会遭受一些非常糟糕的堆损坏(这已被很好地记录).使用HeapAlloc()和GetProcessHeap()而不是malloc(),包括重载new和delete运算符来使用它们,允许你在模块之间传递动态分配的对象,如果在代码中分配内存,则不必担心内存损坏一个模块,一旦指向内存块的指针传递到外部模块,就释放另一个模块的代码.
Dav*_*nan 51
你是对的,他们都从堆中分配内存.但是有区别:
malloc() 便携式,标准的一部分.HeapAlloc() 不可移植,它是Windows API函数.在Windows上,很可能会在Windows malloc之上实现HeapAlloc.我希望malloc比...更快HeapAlloc.
HeapAlloc比...有更多的灵活性malloc.特别是它允许您指定要从中分配的堆.这适用于每个进程多个堆.
对于几乎所有编码场景,您都会使用malloc而不是HeapAlloc.虽然你标记了你的问题C++,但我希望你能使用它new!
小智 24
使用Visual C++,函数malloc()或操作符new最终调用HeapAlloc().如果你调试代码,你会发现功能_heap_alloc_base()(在文件中malloc.c)被调用return HeapAlloc(_crtheap, 0, size)其中_crtheap的一个全局堆与创造HeapCreate().
该函数HeapAlloc()可以很好地最小化内存开销,每个分配最少8个字节的开销.我看到的最大值是每个分配15个字节,分配范围从1个字节到100,000个字节.较大的块具有较大的开销,但是作为分配总量的百分比,它仍然小于有效载荷的2.5%.
我无法评论性能,因为我没有HeapAlloc()使用自定义程序进行基准测试,但是就使用的内存开销而言HeapAlloc(),开销非常低.
malloc 是C标准库(以及C++标准库)中的函数.
HeapAlloc 是一个Windows API函数.
后者允许您指定要分配的堆,我认为这可以用于避免在不同线程中对分配请求进行序列化(请注意该HEAP_NO_SERIALIZE标志).
干杯&hth.,