C++ 删除三维阵列时发生0xfeeefee2错误

C++ 删除三维阵列时发生0xfeeefee2错误,c++,C++,我编写了一个程序,用任意大小的多应用程序表填充三维数组(我知道这不是最有效的代码,但我必须坚持使用指针)。它会编译,但在调试删除部分时,会抛出以下内容: Unhandled exception at 0x0f8f59da (msvcr100d.dll) in 14chap-2.exe: 0xC0000005: Access violation reading location 0xfeeefee2. 我在网上搜索了这个问题: 但找不到合适的答案。据我所知,问题可能在于错误地使用了新的操

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

Unhandled exception at 0x0f8f59da (msvcr100d.dll) in 14chap-2.exe: 0xC0000005: Access violation reading location 0xfeeefee2.
我在网上搜索了这个问题:

但找不到合适的答案。据我所知,问题可能在于错误地使用了新的操作符,但对我来说,它看起来没问题

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

#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();
}   
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
整数大小;
国际尺寸1;
国际尺寸2;
cin>>尺寸;
cin>>尺寸1;
cin>>尺寸2;
尺寸+=2;
尺寸1+=2;
尺寸2+=2;
int***pp=新int**[尺寸];
对于(int i=0;icout您必须首先
删除[]
pp[i][j]
数组,然后才
pp[i]
,最后才
pp

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

经验法则:
调用
delete[]
的顺序与调用
new[]

的顺序完全相反,您必须首先
delete[]
删除
pp[i][j]
数组,然后才是
pp[i]
。最后是
pp

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

经验法则:
调用
delete[]
的顺序与调用
new[]

Put
delete[]pp[i];
的顺序完全相反,因为内部for循环.0xfeeefee2告诉我,您可能正在取消引用堆内存中已释放的指针:Put
delete[]pp[i];
在内部for循环.0xfeeefee2告诉我您可能正在取消引用堆内存中已释放的指针之后: