全局非抛出 ::operator new 和 std::malloc 的区别

C++ 有几个函数来获取动态存储,其中大多数在一些基本方式上有所不同.操作系统通常会添加更多.

C++ has several functions to acquire dynamic storage, most of which differ in some fundamental way. Several more are usually added by the OS.

由于它们的可移植性和相似性,其中两个特别有趣:malloc::operator new.

Two of these are of special interest due to their portability and similarity: malloc and ::operator new.

全局 void* operator new(size_t, ::std::nothrow&)void* malloc(size_t)<之间有什么区别吗?/代码>?

Are there any differences (w.r.t. the standard and implementation) between the global void* operator new(size_t, ::std::nothrow&) and void* malloc(size_t)?

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

Since there seems to be some confusion what I am talking about, consider the following two calls:

void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);

明显而微不足道的区别是如何释放内存:

The obvious and trivial difference is how to deallocate the memory:

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

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

Note: This question is not a duplicate of e.g. What is the difference between new/delete and malloc/free? since it talks about using the global operator new that does not actually perform any ctor calls.

推荐答案

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

The main differences, aside from syntax and free vs. delete, are

  1. 你可以便携地替换 ::operator新的;
  2. malloc 带有 realloc,对于 new 没有等效项;
  3. new 具有 的概念new_handler,没有对应的 malloc.
  1. you can portably replace ::operator new;
  2. malloc comes with realloc, for which new has no equivalent;
  3. new has the concept of a new_handler, for which there is no malloc equivalent.

(替换 malloc 会打开一个 蠕虫病毒.它可以完成,但不可移植,因为它需要链接器的知识.)

(Replacing malloc opens up a can of worms. It can be done, but not portably, because it requires knowledge of the linker.)

相关文章