gpt4 book ai didi

c++ - 不能 deque.push_back() 1000 万+ deques

转载 作者:行者123 更新时间:2023-11-28 06:52:37 26 4
gpt4 key购买 nike

我是一名学生,我的操作系统类(class)项目有一点问题,这对于作业规范本身来说有点多余:

虽然我可以将 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 的双端队列插入 myClass 的双端队列,次数等于用户输入的次数。

这段代码在我制作这个项目的过去几周一直有效,但我的上限一直是 9999,我决定将它与我程序中的大多数其他输入标准化,这是一个相当大 99,999,999。尝试使用 9999 作为用户输入运行此代码工作正常,即使使用 99999999 作为上限。该问题是如果用户输入为 9999999+ 时发生的运行时错误。

为什么这不起作用有什么特别明确的原因吗?

哦,对了,来自 Code::Blocks 13.12 的错误消息本身:

terminate called after throwing an instance of 'std::bad_alloc'

what(): std::bad_alloc

This application has requested the Runtime to terminate it in an unusual way.Please contact the application's supprt team for more information.

Process returned 3 (0x3) execution time : 12.559 sPress any key to continue.

我有屏幕截图,但我需要达到 10+ 声望才能将图像放入我的问题中。

最佳答案

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

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

如果您在 64 位平台上运行并构建 64 位二进制文​​件,您应该能够执行更多的 new/alloc() 调用,但请注意,您可能会开始点击交换。

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

关于c++ - 不能 deque.push_back() 1000 万+ deques,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23644580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com