这是我在GCC malloc / malloc.c中找到的唯一一个类似于malloc()
函数的malloc()定义:
static void* _int_malloc(mstate av, size_t bytes){
但是,在libstdc ++ - v3 \ libsupc ++ \ new_op.cc中,new()
的实现调用了malloc()
一个参数:
_GLIBCXX_WEAK_DEFINITION void * operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc)
{
void *p;
/* malloc (0) is unpredictable; avoid it. */
if (sz == 0)
sz = 1;
p = (void *) malloc (sz);
while (p == 0)
{
new_handler handler = __new_handler;
if (! handler)
_GLIBCXX_THROW_OR_ABORT(bad_alloc());
handler ();
p = (void *) malloc (sz);
}
return p;
}
有人可以确认我找到了C ++ new()
运算符和C malloc()
函数的正确源代码吗?
为那些真正喜欢在他们的代码中学习他们真正做的事情的人编辑,我找到了这个网页,这有点证实我找到了正确的malloc():
http://code.woboq.org/userspace/glibc/malloc/malloc.c.html
EDIT2:我认为这是从new()调用的malloc():
void* __libc_malloc(size_t bytes)
答案 0 :(得分:1)
qwr评论中的duplicate有一个answer,它显示了一个来自Visual C ++的片段(不是MingW,但如果你在Windows上它仍然是相关的):
#include <cstdlib>
#include <new>
_C_LIB_DECL
int __cdecl _callnewh(size_t size) _THROW1(_STD bad_alloc);
_END_C_LIB_DECL
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
正如您所看到的,它与gcc片段非常相似。
1在OP的问题中:
对于Windows,我找到了以下函数:GetProcessHeap,HeapAlloc, HeapCreate,HeapDestroy和HeapFree。
4
你是对的,他们都从堆中分配内存。但那里 是差异:
malloc() is portable, part of the standard. HeapAlloc() is not portable, it's a Windows API function.
在Windows上,很可能会实现malloc HeapAlloc的顶部。我希望malloc比HeapAlloc更快。
HeapAlloc比malloc更具灵活性。特别是它允许 您可以指定要从中分配的堆。这迎合了 每个进程多个堆。
对于几乎所有的编码场景,您都会使用malloc而不是 HeapAlloc。虽然你已经标记了你的C ++问题,但我希望如此 你要使用新的!
5
在Windows中,在最新版本的MSVC中,malloc(和C ++ new,就像它一样 使用与实际内存相同的基础实现 new的分配部分)调用HeapAlloc()。在其他版本中,例如 g ++ mingw,C运行时是一个旧版本,它不能完全调用 直接到HeapAlloc,但在它的基础上,它仍然是 HeapAlloc - 要找到不同的东西,我们需要回到Windows 95之前,它确实有一个GlobalAlloc和LocalAlloc功能集 - 但我认为现在人们不会使用16位编译器 - 至少 不适用于Windows编程。