我正在编译以下代码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更高,但是当我想减小它来限制用户输入时,我仍然无法弄清楚确切的元素。

谢谢!

最佳答案

好吧,这当然取决于操作系统,但是结果对每个人都是相似的。例如,当以32位可执行文件运行时,通常情况下,使用VS2012进行的构建将在向量int*中的26,906,977个元素处停止,这不会对内存造成威胁(甚至不会造成威胁)。

现在,当您构建64位版本时,它变得很有趣,在这种情况下,(几乎)耗尽所有内存时,会抛出bad_alloc。在这种情况下,没有C ++可以保护您。

在下面的屏幕快照中,我将发布一个发生这种情况的示例:抛出bad_alloc时,程序无法捕获它或对其执行任何操作。操作系统介入并杀死了每个进程,并立即释放了内存(见图)。在相应的32版本中,异常通常被捕获,并且释放大约需要10分钟。

现在,这是一种非常简单的查看方式,我确定OS专家可以提供更多见解,但可以在家中尝试使用它(并消耗掉一些内存-我一直不停地想着,在此之后我可以闻到烧掉的东西)



屏幕截图中的代码

#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;
}

关于c++ - 插入Vector数百万个对象=错误分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22695216/

10-11 16:28