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
, 是
- 您可以便携式替换
::operator new
; -
malloc
附带realloc
,new
没有等价物; -
new
有一个new_handler
的概念,没有malloc
等价物。
(更换malloc
会打开一罐蠕虫。它可以完成,但不能移植,因为它需要链接器的知识。
我能想到两个区别:
-
必须使用哪个函数来释放内存,
operator delete
vs.free()
. -
C++程序可以合法地提供自己的
::operator new
版本,并且该版本保证由new
表达式调用。无法使用自己的版本覆盖malloc
。
无需进一步研究,我可以看到的宏观差异是,如果无法完成分配,全局::new
运算符的抛出变体会抛出std::bad_alloc
,而malloc
返回NULL
。但我确实相信这里列出的大多数差异都适用于全局::new
运算符,即使主题是关于new
的。