c++ - 删除 3 维数组时出现 0xfeeefee2 错误

标签 c++

我编写了一个程序,用任意大小的乘法表填充 3 维数组(我知道这不是最有效的代码,但我必须坚持使用指针)。它编译但是在围绕删除部分进行调试时它会抛出这个:

Unhandled exception at 0x0f8f59da (msvcr100d.dll) in 14chap-2.exe: 0xC0000005: Access violation reading location 0xfeeefee2.

我已经通过网络搜索了这个问题:

但找不到合适的答案。据我了解,问题可能出在错误使用 new 运算符上,但对我来说它看起来没问题。

下面是代码中有意义的部分:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>

using namespace std;

int main () {
    int size;
    int size1;
    int size2;
    cin >> size;
    cin >> size1;
    cin >> size2;
    size += 2;
    size1 +=2;
    size2 +=2;
    int ***pp = new int ** [size];

    for (int i = 0; i < size; i++) {
        pp [i] = new int* [size1];

        for (int j = 0; j < size1; j++) {
            pp [i][j] = new int [size2];
        }
    }

    cout << '\n';

    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size1; j++) {
            if (i == 0 || j == 0) {
                pp[i][0][0] = i-1; 
                pp[0][j][0] = j-1;
                cout << pp[i][j][0];
            } else {
                pp [i][j][0] = pp[0][j][0]*pp[i][0][0]; 
                cout << pp[i][j][0];
            }
        }
        cout << '\n';
    }

    for (int i = 0; i < size; i++) {
        delete [] pp[i];    
        for (int j = 0; j < size1; j++) {
            delete [] pp [i][j];
        }
    }

    delete [] pp;

    cin.get();
    cin.ignore();
}   

最佳答案

您必须先删除[] pp[i][j] 数组,然后才pp[i]pp 最后。

现在您首先要删除 pp[i],然后尝试访问 pp[i] 以删除 pp[i][j],这将导致未定义的行为,因为此时 pp[i] 已被删除。

经验法则: 以与 new [] 完全相反的顺序调用 delete []

关于c++ - 删除 3 维数组时出现 0xfeeefee2 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415225/

相关文章:

C++ 如何使用 ESC 按钮终止我的程序

c++ - 分配函数指针时,这两种表示法有什么区别?

c++ - 具有通用引用的过载解决方案

C++:访问虚拟方法

c++ - boost 图形理解顶点创建行为

c++ - 混合转换指针和引用

c++ - 在 C++ 中读取不同格式的数据

c++ - -858993460 是未初始化变量的输出

c++ - 函数返回的 RVO 和右值如何工作?

c++ - 使用指向 QObject 的原始指针作为信号参数是否安全?