我有一个使用STL来使用大容器数字的程序,有时是vector
,有时是deque
;有时它会直接构建一个大的vector
,有时它会以较小的尺寸开始,然后使用resize
进行放大。
vector
或deque
构造函数或resize
有时会抛出“bad_alloc”异常。我的问题是,这里有内存泄漏吗?
如果没有内存泄漏,我可能还会继续;但如果有,事情会更麻烦。
我的系统是Windows 7 64位,Visual Studio 2013,以及32位程序。
答案 0 :(得分:1)
没有
抛出的std::bad_alloc
异常并不意味着存在内存泄漏。这意味着使用运算符new
或运算符new[]
的动态分配失败。
标准容器类型(std::Vector
,std::list
等)使用的默认分配器通常使用运算符new
或new[]
,因此也可以抛出{{1}如果他们失败了。
内存泄漏只是内存耗尽的一个可能原因,反过来,内存耗尽只是导致无法使用std::bad_alloc
或new
动态分配内存的一种可能原因。
一般来说,如果抛出new[]
,则意味着分配内存的尝试失败(并且不需要解除分配)。所以没有泄漏。如果某个对象(或类)实现不当,如果抛出异常,可能会导致内存泄漏。该标准描述了标准容器的要求,以防止这种情况,假设载体的元素也提供了合适的保证。
答案 1 :(得分:-1)
std::bad_alloc
或new
无法分配内存时,会抛出 new[]
。
你的主内存可能用完了吗?您可能尝试过分配特殊结构new int[1024*1024*1024];
?您的堆可能已经碎片化(许多分配和删除),因此无法分配您想要的大小的连续内存空间。