不能deque.push_back()1000万+德克

Can't deque.push_back() 10 million+ deques

本文关键字:1000万 德克 back deque push 不能      更新时间:2023-10-16

我是一名学生,我的操作系统类项目有一点小问题,这对于分配规范本身来说确实有点多余:

虽然我可以将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,看看是否有每个进程的内存限制。