我正在编译以下代码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要高得多,但是当我想减少它来限制用户输入时,我仍然无法确定具体的元素。
谢谢!
答案 0 :(得分:1)
你不能。操作系统可能完全耗尽内存。您可能会发现,对于大量数据,使用deque
数据结构可能会在错误之前变得比vector
更大,因为数据不是连续的,因此它受内存碎片的影响较小,这在你最终分配了超过你整个记忆的一半..
答案 1 :(得分:1)
嗯,它取决于操作系统,但结果会是相似的。例如,当以32位可执行文件运行时,与VS2012一致的构建将在int*
向量中停止在26,906,977个元素,不会对您的内存构成威胁(甚至不会关闭)。
现在,当您构建一个64位版本时,它会变得有趣,在这种情况下,当(几乎)所有内存耗尽时,会发生bad_alloc
。在这种情况下,没有任何其他语言的C ++可以保护您。
在下面的屏幕截图中,我发布了一个这样的例子:当bad_alloc
被抛出时,程序无法捕获它或对它做任何事情。操作系统介入并终止每个进程,并立即释放内存(参见图表)。在相应的32版本中,异常被正常捕获并且释放将花费大约10分钟。
现在这是一种非常简单的方式来看待这一点,我确信操作系统专家可以提供更多的见解,但可以随意在家里尝试(并烧掉一些记忆 - 我不能不再想到我可以闻到一些东西烧掉了之后)
截图中的代码
#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;
}