【发布时间】:2011-01-25 10:30:09
【问题描述】:
重复:In what cases do I use malloc vs new? 和 When to use Malloc instead of New
在现实生活中,有没有人认为在 C++ 中使用“malloc”而不是“new”是合理的?
【问题讨论】:
重复:In what cases do I use malloc vs new? 和 When to use Malloc instead of New
在现实生活中,有没有人认为在 C++ 中使用“malloc”而不是“new”是合理的?
【问题讨论】:
To new is C++;
To malloc is C;
To mix them is sin.
没有很好的理由这样做,而且这个问题与this one 非常相关。
【讨论】:
new 总是调用构造函数(尽管在 POD 的情况下会发生其他情况)。有时——很少——你想处理与任何类型无关的原始内存。当您实现自己的 allocator 类时,可能会出现这种情况。即使那样,malloc 也很少是正确的做法,但有时您可能希望利用realloc 即能够更有效地调整底层存储的大小。这是一种需要malloc 来获取初始存储的场景。
原始内存的另一个实际用例是当您发现自己在实现“不可预测”的伪随机数生成器时(不要!)。为了增加生成器可用的熵,您可以使用未初始化的内存作为随机种子的基础。来自硬件中各种来源的熵对于此类操作至关重要,因此如果您确切知道自己在做什么,可能需要使用未初始化的内存(关于它的预测不多)。
为了完整起见,我应该指出,同样可以通过调用::operator new 而不是malloc 来实现。后者还检查是否可以成功分配所需的内存量,并在出现问题时调用适当的回调处理程序(参见_set_new_handler)。最后但同样重要的是,如果没有处理程序设法释放足够的内存,::operator new 将抛出 std::bad_alloc(除非将 std::nothrow 指定为第二个参数,在这种情况下将返回 0)。
【讨论】:
new char[n] 也会为您提供未初始化的内存,所以它仍然不是malloc 的情况。我想realloc 是吗,真的。
free 释放的块”。
在 C++ 中在某种程度上合理使用 malloc 的唯一示例是创建手动内存分配方案,其中分配大量原始内存,然后创建小对象在这个缓冲区中使用placement-new。
然而,即使是这种使用也是有问题的,因为同样的目标可以而且可能应该通过使用新的或操作系统提供的分配函数来创建一个初始的大字符缓冲区,然后在其中放置新对象。
【讨论】:
Realloc 只能用于分配的内存位置。 Realloc 最好调整内存块的大小,而不是分配新的内存块。内存分配在 C/C++ 中相对昂贵,因此这可能是性能优势。
【讨论】:
最明显的场景是与旧系统集成,这需要您传递或接受某些内存的所有权,因为您不应该混合使用 new/free 或 malloc/delete。
我从未在 C++ 中使用过 malloc
【讨论】: