在 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/