【发布时间】:2014-05-14 02:16:46
【问题描述】:
我是一名学生,我的操作系统课程项目有一点小问题,这对于作业规范本身来说确实有点多余:
虽然我可以将 100 万双端队列推送到我的双端队列中,但我无法推送大约 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 的 deques 推送到 myClass 的 deques 的 deque 中,次数等于用户输入的次数。
在我制作这个项目的过去几周里,这段代码一直在工作,但我的上限一直是 9999,我决定用我的程序中的大多数其他输入来标准化它,这是一个相当大的 99,999,999。尝试使用 9999 作为用户输入运行此代码可以正常工作,即使将 99999999 作为上限也是如此。如果用户输入为 9999999+,则会出现运行时错误。
这不起作用有什么特别明确的原因吗?
哦,对了,来自 Code::Blocks 13.12 的错误消息本身:
在抛出 'std::bad_alloc' 的实例后调用终止
what(): std::bad_alloc
此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队了解更多信息。
进程返回 3 (0x3) 执行时间:12.559 s 按任意键继续。
我有截图,但我需要 10+ 声望才能将图像放入我的问题中。
【问题讨论】:
-
因为内存不足?
-
我不知道,是吗?我有一台 8gb 内存机器,它的内存使用率为 34%。要跟踪的 1000 万件事情似乎微不足道,除非每个容器大约 570 字节或更多。