我是学生,我的操作系统类项目有一点障碍,这对于作业规范本身来说无疑是多余的:
虽然我可以在我的deques deques中推出100万张deques,但我无法推动大约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
此应用程序已请求Runtime以不寻常的方式终止它。 有关更多信息,请联系应用程序的支持团队。
进程返回3(0x3)执行时间:12.559秒 按任意键继续。
我有截图,但为了将图片放入我的问题,我需要获得10+的声誉。
答案 0 :(得分:1)
这看起来像地址空间耗尽。
如果要编译32位目标,则每个进程通常限制为2 GiB的用户模式可访问地址空间,或者某些平台上可能为3 GiB。 (其余部分保留用于进程之间共享的内核模式映射)
如果您在64位平台上运行并构建64位二进制文件,那么您应该可以进行更多new
/ alloc()
次呼叫,但建议您可以开始执行交换
或者,即使您正在构建64位二进制文件,也可能会遇到资源配额。在Linux上,您可以检查ulimit -d
以查看是否有每进程内存限制。