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

标签 c++ bad-alloc

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

相关文章:

c++ - 用于 g++ 编译的 C++ 文件的用户定义扩展

c++ - 程序崩溃 - 创建新的 char 数组时出现 bad_alloc

c++ - 来自同一物理类的多重继承

c++ - decltype 不推导 const 对象的 const 成员

c++ - 制作 gcc4.8.1 时无法打开 libmpc.so.3

C++ STL 优先级队列插入 bad_alloc 异常

sorting - cuda/thrust : Trying to sort_by_key 2. 6GB GPU RAM 中的 8GB 数据抛出 bad_alloc

c++ - 来自 libc.so.6 C++ 的 bad_alloc

c++ - 为什么我的 WinCE 应用程序中没有 std::bad_alloc?

c++ - 关于从基类到子类指针的向下转型