抛出"bad_alloc"的最常见原因是什么?

And*_* N. 4 c++ bad-alloc c++11

是否存在与内存相关的更频繁的错误抛出bad_alloc?我知道这意味着内存分配失败了,但在代码中导致这种情况的最常见错误是什么?

Mas*_*gio 5

编辑:其他评论者指出了一些有趣的场景.为了完整起见,我将它们添加到我的回复中.

案例1:内存不足

我的理解是,只要操作符new和new []无法将内存分配给对象或变量,就会抛出bad_alloc.如果你已经新建了一堆对象而忘记在它们超出范围之前删除它们(例如,你的代码像疯了一样泄漏),就会发生这种情况.

案例2:一举分配大量内存

分配大块内存(如1000 x 1000 x 1000双精度矩阵)可能会失败,因为它需要一个大小的单个块.

可能有几个可用的内存块,但这些内存块都不够大.

案例3:将无效值传递给new []

如果传递负值作为其参数,则抛出bad_alloc.

  • 案例2可能是错误的.如果您尝试反映来自user4581301的注释,则失败来自单个_contiguous_分配.即使计算机具有可分配一百万个双精度的空闲内存,该内存也可能不在单个不间断的连续块中. (3认同)
  • 怪物泄漏是最受欢迎的候选者之一,但另一个常见错误是试图分配比你想象的要多得多的内存.例如,1000x1000x1000的`double`s数组.你可能有几吨的RAM,但有多少是免费的,是否有任何8 GB的连续块? (2认同)
  • @MassimoDiSaggio - 是的.尝试一下,你会看到`std :: bad_alloc`被抛出,更确切地说是一个`std :: bad_array_new_length`,它是从'bad_alloc`派生出来的. (2认同)