gpt4 book ai didi

c++ - 将数百万个对象插入 Vector = bad-alloc

转载 作者:行者123 更新时间:2023-11-28 02:52:38 25 4
gpt4 key购买 nike

我正在编译以下代码 VS2012 - 32BIT。我知道 ma​​x_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,因此不会出现此问题,因为最大上限要高得多,但当我想减少它以限制用户输入时,我仍然无法确定确切的元素。

谢谢!

最佳答案

好吧,这当然取决于操作系统,但结果对每个人来说都是相似的。例如,当作为 32 位可执行文件运行时,使用 VS2012 的构建始终会在 int* vector 中的 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;
}

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com