呈C++,香草萨特在项35写作为指导:为什么我更喜欢在堆上使用免费商店?
使用自由存储区体型(新的/删除)。避免使用堆 (malloc/free)。
我为什么要?
如果实施选择通过使用malloc
来实现new
,则可能会产生开销,因此就性能而言,看起来像是一个糟糕的建议。
呈C++,香草萨特在项35写作为指导:为什么我更喜欢在堆上使用免费商店?
使用自由存储区体型(新的/删除)。避免使用堆 (malloc/free)。
我为什么要?
如果实施选择通过使用malloc
来实现new
,则可能会产生开销,因此就性能而言,看起来像是一个糟糕的建议。
的new
和delete
关键字在C++通常在malloc
和free
方面实现的,但它们被设计用来做不同的事情。
在C++中,如果你说
new T(/* args */)
C++将执行以下操作:
T
类型的对象。std::bad_alloc
对象。T
的对象。T
的对象的构造引发异常,则会自动释放内存。如果只是用malloc
,你必须手动完成所有这些步骤,这将是非常,非常硬。它可能是这个样子:
T* memory;
while (true) {
memory = static_cast<T*>(malloc(sizeof(T)));
if (memory == nullptr) std::get_new_handler()();
}
try {
new (memory) T(/* args */);
} catch (...) {
free(memory);
throw;
}
这里有,我已经掩盖了(就像调用operator new
,而不是malloc
,或处理零大小的请求等)其他一些细微之处,但我希望这有助于解释如何new
和malloc
是不同的。
那么,为什么你应该使用new
而不是malloc
?好吧,有几个原因:
它更安全。 With malloc
With you malloc
您可以忘记检查空指针的返回类型,或者您可能请求错误的存储空间量,或者您可能忘记调用对象的构造函数,或者如果构造函数抛出时可能忘记释放内存例外等
它更安全。malloc
返回一个void*
,它只是一个指向内存块的指针。使用malloc
,您必须将指针转换为正确的类型,这会在稍后引入错误。
它允许自定义。某些类型重载operator new
以不寻常的方式请求内存,例如来自池分配器或某些可能更快的内存块,或者使用自定义分配器来优化使用模式。鉴于此,只需定义operator new
和operator delete
,您就可以自动定制动态分配内存类型为T
的对象的所有时间。如果使用malloc
,则必须在整个程序中追查所有内存分配站点。
也就是说,malloc
有一些优点。如果你确实知道你正在分配的对象是平凡的对象(如原始数据或只保存数据的结构),那么使用malloc
可能会稍微快一点。 malloc
也可以让你使用realloc
,其中free
没有。但说实话,在这种情况下使用std::vector
或std::array
可能会更好,因为它们更安全,更易于调试,并且具有良好的编译器支持可能会被积极优化。
希望这会有所帮助!
http://stackoverflow.com/questions/1350819/c-free-store-vs-heap - 似乎回答你的问题 – DarkWanderer 2013-05-06 18:23:45
'malloc/free'不知道构造函数和析构函数是什么。这足以说明一直使用'new/delete'的原因。 – syam 2013-05-06 18:23:48
@syam:谢谢,但我认为Exceptional C++的读者已经对'malloc'和'new'之间的区别有所了解。我希望这本书的作者试图提出另一个观点。 – qdii 2013-05-06 18:26:12