0

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

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

那么我怎么知道我的容器可以真正存储多少对象呢?(我有 64GB 内存)

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,因此不会发生此问题,因为最大上限要高得多,但是当我想将其减小以限制用户输入时,我仍然无法确定确切的元素。

谢谢!

4

2 回答 2

1

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

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

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

现在这是一种非常简单的看待方式,我相信操作系统专家可以提供更多见解,但可以在家里随意尝试(并烧掉一些内存 - 我不能停止认为我可以闻到在此之后烧焦的东西)

超过 16GB 内存

截图中的代码

#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;
}
于 2014-03-27T18:23:17.610 回答
1

You can't. OS could totally run out of memory. You may find that using deque data structure can become larger before error than vector for huge amounts of data, as the data is not contiguous and so it is less effected by memory fragmentation, which can be significant when you end up allocating more than half your entire memory..

于 2014-03-27T17:47:28.220 回答