gpt4 book ai didi

c++ - 内存位置未处理的异常 bad_alloc

转载 作者:行者123 更新时间:2023-11-30 02:47:11 28 4
gpt4 key购买 nike

在 c++ 中,分配内存时会发生 bad_alloc,或者至少我是这么理解的,但现在我在从数组读取内存时遇到此错误。我创建数组:

int * possible = new int[ suma ];

然后我得到两个 for 循环,我在其中访问整个数组:

for( int i = 0; i < n - 1; i++ ){
int rowWidth = (i - 1) < 0 ? 0 : permutationsNumber[i];
for( int j = 0; j < permutationsNumber[i]; j++ ){
possible[i * rowWidth + j ] = j;
}
}

for( int i = 0; i < n - 1; i++ ){
int rowWidth = (i - 1) < 0 ? 0 : permutationsNumber[i];
for( int j = 0; j < permutationsNumber[i]; j++ ){
std::cout << possible[i * rowWidth + j ] << "\n";
}

在行中的第二个 std::cout << possible[i * rowWidth + j ] << "\n";是我得到错误的地方。

我在 Windows 上编译代码,尝试使用 3 台装有 Windows 8 和 7 的不同机器,使用 VS 2010、2012 和 2013,但得到了同样的错误。

当我在 Mac 上编译代码时没有错误,同样使用 compileonline

我认为不重要的变量值是:

n = 4;
permutationsNumber = {4, 12, 24};
suma = 40;

最佳答案

您对 bad_alloc 的理解有点不正确。 bad_alloc 在未能分配请求的内存量时由 new 运算符抛出。如果您向 new 发送非常大的值,这种情况并不少见。

例如,如果 suma 没有被初始化,就会发生这种情况。

您应该在调试器中启用首次异常处理(gdb 中的catch throw)并验证抛出异常的位置以及您的程序请求的内存量。

您可能观察到的是无效的内存引用。您可以将代码替换为使用 std::vector 并使用 at() 方法来访问元素。如果您错误地访问了超出范围的元素,这将抛出异常。

或者,添加这样的断言:

#include<cassert>
...
const int idx = i * rowWidth + j;
assert(idx >= 0);
assert(idx < suma);
possible[idx] = j;

如果断言触发(它可能会触发),您现在将确认您的数组太小或您的索引无效。

关于c++ - 内存位置未处理的异常 bad_alloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22902964/

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