向Vector推送数百万个对象= bad-alloc

时间:2014-03-27 17:40:28

标签: c++ visual-studio-2012 bad-alloc

我正在编译以下代码VS2012 - 32BIT。我知道 max_size()会返回

“容器可以达到的最大可能尺寸”在我的情况下:1.073.741.823 (是的)

那么我怎么知道,我的容器可以存储多少个对象? (我有64GB RAM)

unsigned int = 100000000;
vector<int*> data;
std::cout<<"max cap: "<<data.max_size()<<std::endl;
for(unsigned int i = 0; i < operationUnit; i++)
data.push_back(new int());

这将最终导致错误的分配。然而,因为我正在针对x64这个问题不会发生,因为max-cap要高得多,但是当我想减少它来限制用户输入时,我仍然无法确定具体的元素。

谢谢!

2 个答案:

答案 0 :(得分:1)

你不能。操作系统可能完全耗尽内存。您可能会发现,对于大量数据,使用deque数据结构可能会在错误之前变得比vector更大,因为数据不是连续的,因此它受内存碎片的影响较小,这在你最终分配了超过你整个记忆的一半..

答案 1 :(得分:1)

嗯,它取决于操作系统,但结果会是相似的。例如,当以32位可执行文件运行时,与VS2012一致的构建将在int*向量中停止在26,906,977个元素,不会对您的内存构成威胁(甚至不会关闭)。

现在,当您构建一个64位版本时,它会变得有趣,在这种情况下,当(几乎)所有内存耗尽时,会发生bad_alloc。在这种情况下,没有任何其他语言的C ++可以保护您。

在下面的屏幕截图中,我发布了一个这样的例子:当bad_alloc被抛出时,程序无法捕获它或对它做任何事情。操作系统介入并终止每个进程,并立即释放内存(参见图表)。在相应的32版本中,异常被正常捕获并且释放将花费大约10分钟。

现在这是一种非常简单的方式来看待这一点,我确信操作系统专家可以提供更多的见解,但可以随意在家里尝试(并烧掉一些记忆 - 我不能不再想到我可以闻到一些东西烧掉了之后)

exceeding 16GB of memory

截图中的代码

#include <iostream>
#include <vector>
#include <exception>

using namespace std;


int main() 
{

    vector<int*> maxV;

    try 
    {
        while (true) maxV.push_back(new int);
    } 
    catch (bad_alloc &e) 
    {
        cout << "I caught bad alloc at element no " << maxV.size() << "\n";
        for (auto i : maxV) delete i;
    } 
    catch (exception &e) 
    {
        cout << "Some other exception happened at element no " << maxV.size() << "\n";
        for (auto i : maxV) delete i;
    }

    return 0;
}