当STL抛出“bad_alloc”异常时是否存在内存泄漏?

时间:2016-12-18 09:04:45

标签: c++ memory-leaks stl

我有一个使用STL来使用大容器数字的程序,有时是vector,有时是deque;有时它会直接构建一个大的vector,有时它会以较小的尺寸开始,然后使用resize进行放大。

vectordeque构造函数或resize有时会抛出“bad_alloc”异常。我的问题是,这里有内存泄漏吗? 如果没有内存泄漏,我可能还会继续;但如果有,事情会更麻烦。

我的系统是Windows 7 64位,Visual Studio 2013,以及32位程序。

2 个答案:

答案 0 :(得分:1)

没有

抛出的std::bad_alloc异常并不意味着存在内存泄漏。这意味着使用运算符new或运算符new[]的动态分配失败。

标准容器类型(std::Vectorstd::list等)使用的默认分配器通常使用运算符newnew[],因此也可以抛出{{1}如果他们失败了。

内存泄漏只是内存耗尽的一个可能原因,反过来,内存耗尽只是导致无法使用std::bad_allocnew动态分配内存的一种可能原因。

一般来说,如果抛出new[],则意味着分配内存的尝试失败(并且不需要解除分配)。所以没有泄漏。如果某个对象(或类)实现不当,如果抛出异常,可能会导致内存泄漏。该标准描述了标准容器的要求,以防止这种情况,假设载体的元素也提供了合适的保证。

答案 1 :(得分:-1)

std::bad_allocnew无法分配内存时,会抛出

new[]

你的主内存可能用完了吗?您可能尝试过分配特殊结构new int[1024*1024*1024];?您的堆可能已经碎片化(许多分配和删除),因此无法分配您想要的大小的连续内存空间。