向量中的错误内存分配

3

看看这段代码:

int main()
{
    int m;
    cin >> m;
    vector<int> cnt(m +1,0);
}

现在,如果我取m=999999298(这是一个整数,对吧?),为什么我在向量中会得到“内存分配错误”的错误?

5
你是否在开发32位应用程序?你正在分配4GB内存,但每个应用程序可能只允许2GB。 - Alan Birtles
如果您采用更小的值会怎样呢?那么它是否有效?如果有效,那么它停止工作的阈值是多少? - Blaze
现在,sizeof(int)通常是4(32位)。 999999298 * 4 = 3999997192字节= 3906247.26千字节= 3814.69兆字节= 3.72 GB。 如果您使用的是32位平台,则可能无法分配此大小的内存。 即使在64位上,可能也没有足够的连续内存可用。 - Scheff's Cat
@Scheff: 当然,从理论上讲这是可能的,但它需要在它们之间留下3.71 GB的空隙,并进行40亿次的先前分配。 - MSalters
@MSalters 好的。忘记我之前提到的64位问题。OP没有提到操作系统和平台,但是提到了bad-alloc问题。所以,可能是32位平台。(如果OP能添加这些信息会更容易。) - Scheff's Cat
@MSalters 我必须承认,我已经很久没有在我们的软件中看到bad-alloc错误了(可能是几十年前的事情了)。但有时候会看到连续的内存消耗,直到RAM用尽。操作系统(我的情况下是Windows 10)开始交换到硬盘,这会显著减慢一切,直到整个操作系统似乎被冻结(甚至无法根据鼠标移动更新鼠标指针)。此时,我通常会等待一段时间后重新启动计算机,并尝试使用更小的问题规模...;-) - Scheff's Cat
1个回答

8
vector<int> cnt(m +1,0);

你尝试声明一个名为vector的变量,它要分配999999299个整数元素并且每个元素的值都是0。考虑到整数是4字节,这大约需要3.7 GB的内存空间。看起来你的应用程序没有被允许使用那么多的内存,这就是为什么你会收到“内存分配失败”的错误消息。
至于为什么有这样的限制,你可以阅读这个问题及其答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接