不能deque.push_back()1000万+ deques

时间:2014-05-14 02:16:46

标签: c++ deque push-back

我是学生,我的操作系统类项目有一点障碍,这对于作业规范本身来说无疑是多余的:

虽然我可以在我的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+的声誉。

1 个答案:

答案 0 :(得分:1)

这看起来像地址空间耗尽。

如果要编译32位目标,则每个进程通常限制为2 GiB的用户模式可访问地址空间,或者某些平台上可能为3 GiB。 (其余部分保留用于进程之间共享的内核模式映射)

如果您在64位平台上运行并构建64位二进制文​​件,那么您应该可以进行更多new / alloc()次呼叫,但建议您可以开始执行交换

或者,即使您正在构建64位二进制文​​件,也可能会遇到资源配额。在Linux上,您可以检查ulimit -d以查看是否有每进程内存限制。