2013-05-06 105 views
4

呈C++,香草萨特在项35写作为指导:为什么我更喜欢在堆上使用免费商店?

使用自由存储区体型(新的/删除)。避免使用堆 (malloc/free)。

我为什么要?

如果实施选择通过使用malloc来实现new,则可能会产生开销,因此就性能而言,看起来像是一个糟糕的建议。

+0

http://stackoverflow.com/questions/1350819/c-free-store-vs-heap - 似乎回答你的问题 – DarkWanderer 2013-05-06 18:23:45

+6

'malloc/free'不知道构造函数和析构函数是什么。这足以说明一直使用'new/delete'的原因。 – syam 2013-05-06 18:23:48

+0

@syam:谢谢,但我认为Exceptional C++的读者已经对'malloc'和'new'之间的区别有所了解。我希望这本书的作者试图提出另一个观点。 – qdii 2013-05-06 18:26:12

回答

11

newdelete关键字在C++通常在mallocfree方面实现的,但它们被设计用来做不同的事情。

在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,或处理零大小的请求等)其他一些细微之处,但我希望这有助于解释如何newmalloc是不同的。

那么,为什么你应该使用new而不是malloc?好吧,有几个原因:

  • 它更安全。 With malloc With you malloc您可以忘记检查空指针的返回类型,或者您可能请求错误的存储空间量,或者您可能忘记调用对象的构造函数,或者如果构造函数抛出时可能忘记释放内存例外等

  • 它更安全。malloc返回一个void*,它只是一个指向内存块的指针。使用malloc,您必须将指针转换为正确的类型,这会在稍后引入错误。

  • 它允许自定义。某些类型重载operator new以不寻常的方式请求内存,例如来自池分配器或某些可能更快的内存块,或者使用自定义分配器来优化使用模式。鉴于此,只需定义operator newoperator delete,您就可以自动定制动态分配内存类型为T的对象的所有时间。如果使用malloc,则必须在整个程序中追查所有内存分配站点。

也就是说,malloc有一些优点。如果你确实知道你正在分配的对象是平凡的对象(如原始数据或只保存数据的结构),那么使用malloc可能会稍微快一点。 malloc也可以让你使用realloc,其中free没有。但说实话,在这种情况下使用std::vectorstd::array可能会更好,因为它们更安全,更易于调试,并且具有良好的编译器支持可能会被积极优化。

希望这会有所帮助!

相关问题