全局非抛出 ::运算符 new 和 std::malloc 之间的区别



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);

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

主要区别,除了语法和free vs. delete , 是

  1. 您可以便携式替换::operator new;
  2. malloc附带reallocnew没有等价物;
  3. new有一个new_handler的概念,没有malloc等价物。

(更换malloc会打开一罐蠕虫。它可以完成,但不能移植,因为它需要链接器的知识。

我能想到两个区别:

  1. 必须使用哪个函数来释放内存,operator delete vs. free() .

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

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

最新更新