全局operator new和malloc之间的区别

时间:2014-04-24 14:13:53

标签: c++ c++11 memory-management malloc new-operator

C ++有几个获取动态存储的功能,其中大多数功能在某些基本方面有所不同。操作系统通常会添加更多内容。

由于其可移植性和相似性,其中两个特别感兴趣: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);

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

::std::free(p);
::operator delete(q);

注意:此问题不与例如What is the difference between new/delete and malloc/free?因为它涉及使用实际上不执行任何ctor调用的全局 operator new

3 个答案:

答案 0 :(得分:18)

除了语法和freedelete之外,主要区别是

  1. 您可以移植replace ::operator new;
  2. malloc附带reallocnew没有相应的内容;
  3. new具有new_handler的概念,其中没有malloc等效。
  4. (替换malloc打开can of worms。可以完成,但不能移植,因为它需要知道链接器。)

答案 1 :(得分:4)

我能想到两个不同之处:

  1. 您必须使用哪种功能来释放内存,operator deletefree()

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

答案 2 :(得分:1)

我可以看到没有进一步研究的宏观差异是,如果无法完成分配,则全局::new运算符的抛出变量会抛出std::bad_alloc,而malloc会返回NULL }。但我相信列出here的大多数差异都适用于全局::new运算符,即使主题是new