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
。
答案 0 :(得分:18)
除了语法和free
与delete
之外,主要区别是
::operator new
; malloc
附带realloc
,new
没有相应的内容; new
具有new_handler
的概念,其中没有malloc
等效。(替换malloc
打开can of worms。可以完成,但不能移植,因为它需要知道链接器。)
答案 1 :(得分:4)
我能想到两个不同之处:
您必须使用哪种功能来释放内存,operator delete
与free()
。
C ++程序可以合法地提供自己的::operator new
版本,并保证该版本由new
表达式调用。无法使用您自己的版本覆盖malloc
。
答案 2 :(得分:1)
我可以看到没有进一步研究的宏观差异是,如果无法完成分配,则全局::new
运算符的抛出变量会抛出std::bad_alloc
,而malloc
会返回NULL
}。但我相信列出here的大多数差异都适用于全局::new
运算符,即使主题是new
。