全局operator new和malloc之间的区别

gha*_*.st 23 c++ malloc memory-management new-operator c++11

C++有几个功能来获取动态存储,其中大部分功能在某些基本方面有所不同.OS通常会添加几个.

由于它们的便携性和相似性,其中两个特别感兴趣:malloc::operator new.

全局void* operator new(size_t, ::std::nothrow&)void* malloc(size_t)?之间是否有任何差异(标准和实施)?

由于我所说的似乎有些混乱,请考虑以下两个调用:

void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);
Run Code Online (Sandbox Code Playgroud)

明显和微不足道的区别在于如何释放内存:

::std::free(p);
::operator delete(q);
Run Code Online (Sandbox Code Playgroud)

注意:这个问题不重复,例如new/delete和malloc/free有什么区别?因为它谈到使用实际上不执行任何ctor调用的全局 operator new.

Fre*_*Foo 18

除了语法和freevs. 之外,主要区别delete在于

  1. 你可以替换 ::operator new ;
  2. malloc附带realloc,new没有相应的;
  3. new有a的概念,new_handler没有malloc相应的概念.

(更换会malloc打开一堆蠕虫.它可以完成,但不能移植,因为它需要知道链接器.)


Rei*_*ica 5

我能想到的有两个区别:

  1. 您必须使用哪个函数来释放内存,operator deletefree().

  2. C++ 程序可以合法地提供它自己的版本,::operator new并且该版本保证被new表达式调用。无法malloc使用您自己的版本进行覆盖。