不能deque.push_back()1000万+德克
Can't deque.push_back() 10 million+ deques
我是一名学生,我的操作系统类项目有一点小问题,这对于分配规范本身来说确实有点多余:
虽然我可以将100万个deque推入deque的deque,但我不能推入~ 1000万或更多。
现在,在实际的程序中,有很多事情正在进行,而Stack Overflow上已经问过的唯一一件事,即使是最轻微的相关性,也只是轻微的相关性。https://stackoverflow.com/a/11308962/3407808
由于答案集中在"其他函数破坏堆"上,我将代码分离到一个新项目中,并单独运行,发现所有内容都以完全相同的方式失败。
下面是代码本身,为了节省空间,对其进行了简化和重命名。
#include <iostream>
#include <string>
#include <sstream>
#include <deque>
using namespace std;
class cat
{
cat();
};
bool number_range(int lower, int upper, double value)
{
while(true)
{
if(value >= lower && value <= upper)
{
return true;
}
else
{
cin.clear();
cerr << "Value not between " << lower << " and " << upper << ".n";
return false;
}
}
}
double get_double(char *message, int lower, int upper)
{
double out;
string in;
while(true) {
cout << message << " ";
getline(cin,in);
stringstream ss(in); //convert input to stream for conversion to double
if(ss >> out && !(ss >> in))
{
if (number_range(lower, upper, out))
{
return out;
}
}
//(ss >> out) checks for valid conversion to double
//!(ss >> in) checks for unconverted input and rejects it
cin.clear();
cerr << "Value not between " << lower << " and " << upper << ".n";
}
}
int main()
{
int dq_amount = 0;
deque<deque <cat> > dq_array;
deque<cat> dq;
do {
dq_amount = get_double("INPUT # OF DEQUES: ", 0, 99999999);
for (int i = 0; i < number_of_printers; i++)
{
dq_array.push_back(dq);
}
} while (!number_range(0, 99999999, dq_amount));
}
如果这有点混淆,设计(只是以防它与错误有关)是我的程序要求您输入一个整数值。它接受您的输入并验证它是否可以作为整数读取,然后进一步解析它以确保它在特定的数值范围内。一旦在边界内找到,我将myClass的deque推入myClass的deque的deque中,次数等于用户输入的次数。
这段代码在过去的几个星期里一直在工作,我一直在做这个项目,但我的上限一直是9999,我决定用我程序中的大多数其他输入来标准化它,这是一个相当大的99,999,999。尝试使用9999作为用户输入来运行这段代码可以正常工作,即使使用99999999作为上界。这个问题是一个运行时错误,如果用户输入是9999999+。
有什么特别的,明确的原因为什么这不起作用?
哦,对了,错误信息本身来自Code::Blocks 13.12:
抛出'std::bad_alloc'实例后终止调用
(): std:: bad_alloc
这个应用程序请求运行时以一种不寻常的方式终止它。请联系应用程序的支持团队获取更多信息。
进程返回3 (0x3)执行时间:12.559 s按任意键继续。
我有截图,但我需要10+声誉,以便将图像放入我的问题
地址空间耗尽
如果您正在为32位目标编译,则通常将每个进程的用户模式可访问地址空间限制为2gib,或者在某些平台上可能限制为3gib。(其余部分保留给进程间共享的内核模式映射)
如果您在64位平台上运行并构建64位二进制文件,您应该能够执行更多的new
/alloc()
调用,但建议您可能开始点击swap。
或者,即使您正在构建64位二进制文件,也可能达到资源配额。在Linux上,您可以检查ulimit -d
,看看是否有每个进程的内存限制。
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 瓦尔格林德:注意到但未处理的国际奥克特尔;是否有必要处理以及如何找到?
- 如何使用堆栈反转德克?
- C++2骰子滚动1000万次开始
- 大通列夫德克的原子存储
- 德克内存释放
- "insert"对德克的引用有什么影响?
- 需要了解德克
- 这是否可以通过 C++ 或 C# 中的某种数学运算将 1000 万位数字转换为 1000 位数字
- 我怎样才能插入到一个集合和一个德克
- 杜兰德-克纳方法寻找非线性方程的根
- C++德克投掷赛格错误
- 向量与德克运算符[]
- 关于德克<T>的额外间接寻址
- 128 位 MD5 在不同数量的文件(例如 1000 万或 5000 万)上的冲突率是多少?
- 德克 - 为什么"储备"不存在?
- 不能deque.push_back()1000万+德克
- 德克实现选项