我编写了一个程序,用任意大小的乘法表填充 3 维数组(我知道这不是最有效的代码,但我必须坚持使用指针)。它编译但是在围绕删除部分进行调试时它会抛出这个:
Unhandled exception at 0x0f8f59da (msvcr100d.dll) in 14chap-2.exe: 0xC0000005: Access violation reading location 0xfeeefee2.
我已经通过网络搜索了这个问题:
- http://cboard.cprogramming.com/cplusplus-programming/159947-problem-deleting-freeing-memory.html
- http://www.cplusplus.com/forum/beginner/132263/
但找不到合适的答案。据我了解,问题可能出在错误使用 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/