GCC malloc()是正确的吗?

时间:2013-12-15 17:36:40

标签: c++ c gcc malloc new-operator

这是我在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)

1 个答案:

答案 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. These
  2. links
  3. may
  4. be
  5. useful
  6. 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编程。