当有'新'时,有没有什么好的理由在C ++中使用'malloc'?

时间:2010-03-09 13:15:04

标签: c++ malloc

  

可能重复:
  In what cases do I use malloc vs new?

重复:In what cases do I use malloc vs new?When to use Malloc instead of New

有没有人有真实的编程场景,在C ++中使用“malloc”而不是“new”是合理的?

6 个答案:

答案 0 :(得分:3)

<强> To new is C++;
To malloc is C;
To mix them is sin.

没有很好的理由这样做,这个问题与this one非常相关。

答案 1 :(得分:3)

new总是调用构造函数(尽管在POD的情况下会发生其他事情)。有时 - 很少 - 你想要处理原始内存,而不是与任何类型相关联。当您实现自己的allocator课程时可能就是这种情况。即便如此,malloc很少是正确的事情,但有时您可能希望利用realloc,即能够更有效地调整底层存储的大小。这是一个需要malloc才能获得初始存储的方案。

原始内存的另一个实际用例是当你发现自己实现了一个“不可预测的”伪随机数生成器(!)。为了增加生成器可用的熵,可以使用未初始化的内存作为随机种子的基础。来自硬件中各种来源的熵对于这样的操作是至关重要的,因此使用未初始化的存储器(可以做出很少的预测)是可取的,如果你确切地知道你在做什么


为了完整起见,我应该指出通过调用::operator new而不是malloc可以实现同样的目的。后者还会检查是否可以成功分配所需的内存量,并在出现问题时调用相应的回调处理程序(参见_set_new_handler)。最后但并非最不重要的是,如果没有处理程序设法释放足够的内存,::operator new将抛出std::bad_alloc(除非std::nothrow被指定为第二个参数,在这种情况下将返回0 )。

答案 2 :(得分:0)

最明显的情况是与遗留系统集成,要求您传递或接受某些内存的所有权,因为您不应混合使用new / free或malloc / delete。

我从未使用过C ++的malloc

答案 3 :(得分:0)

在C ++中有点合理使用malloc的唯一例子是创建一个手动内存分配方案,其中分配了大量的原始内存,然后创建了小对象在此缓冲区中使用placement-new。

然而,即使这种使用也是值得怀疑的,因为同样的目标可以并且可能应该通过使用新的或操作系统提供的分配函数来创建char的初始大缓冲区,然后在其中放置新对象来实现。

答案 4 :(得分:0)

答案 5 :(得分:0)

Realloc只能用于malloced的内存位置。 Realloc优先调整内存块的大小,而不是分配新内存块。在C / C ++中,内存分配相对昂贵,因此这可能是性能优势。