问题遇到的现象和发生背景
题目:实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组,输出指定结果
以下程序来源于网上,在OJ上也没有报错,但是好奇为啥没有因为下述原因(最底部)被报错。哪位兄弟能帮我解决这个问题,多谢啦!
问题相关代码,请勿粘贴截图
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
template <class T>
class CArray3D
{
public:
T* p;
int f, r, c; //数组共f层,每层r行,每行c列
class CArray2D {
public:
T* fp; // fp是一层的元素的起始地址
int c; //数组每行c列
CArray2D(T* p_, int c_) :fp(p_), c(c_) { }
T* operator[](int r) {
return fp + r * c; //返回本层的第 r行起始地址
}
operator T* () {
return fp; //返回值本层的起始地址
}
};
CArray3D(int _f, int _r, int _c) :f(_f), r(_r), c(_c) {
p = new T[f * r * c];
}
CArray2D operator[](int _f) {//第_f层元素的起始地址
return CArray2D(p + _f * r * c, c);
}
~CArray3D() { delete[] p; }
};
CArray3D<int> a(3, 4, 5);
CArray3D<double> b(3, 2, 2);
void PrintA()
{
for (int i = 0; i < 3; ++i) {
cout << "layer " << i << ":" << endl;
for (int j = 0; j < 4; ++j) {
for (int k = 0; k < 5; ++k)
cout << a[i][j][k] << ",";
cout << endl;
}
}
}
void PrintB()
{
for (int i = 0; i < 3; ++i) {
cout << "layer " << i << ":" << endl;
for (int j = 0; j < 2; ++j) {
for (int k = 0; k < 2; ++k)
cout << b[i][j][k] << ",";
cout << endl;
}
}
}
int main()
{
int No = 0;
for (int i = 0; i < 3; ++i) {
a[i];
for (int j = 0; j < 4; ++j) {
a[j][i];
for (int k = 0; k < 5; ++k)
a[i][j][k] = No++;
a[j][i][i];
}
}
PrintA();
memset(a[1], -1, 20 * sizeof(int));
memset(a[1], -1, 20 * sizeof(int));
PrintA();
memset(a[1][1], 0, 5 * sizeof(int));
PrintA();
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 2; ++j)
for (int k = 0; k < 2; ++k)
b[i][j][k] = 10.0 / (i + j + k + 1);
PrintB();
int n = a[0][1][2];
double f = b[0][1][1];
cout << "****" << endl;
cout << n << "," << f << endl;
return 0;
}
运行结果及报错内容
无报错
运行结果:
layer 0:
0,1,2,3,4,
5,6,7,8,9,
10,11,12,13,14,
15,16,17,18,19,
layer 1:
20,21,22,23,24,
25,26,27,28,29,
30,31,32,33,34,
35,36,37,38,39,
layer 2:
40,41,42,43,44,
45,46,47,48,49,
50,51,52,53,54,
55,56,57,58,59,
layer 0:
0,1,2,3,4,
5,6,7,8,9,
10,11,12,13,14,
15,16,17,18,19,
layer 1:
-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,
layer 2:
40,41,42,43,44,
45,46,47,48,49,
50,51,52,53,54,
55,56,57,58,59,
layer 0:
0,1,2,3,4,
5,6,7,8,9,
10,11,12,13,14,
15,16,17,18,19,
layer 1:
-1,-1,-1,-1,-1,
0,0,0,0,0,
-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,
layer 2:
40,41,42,43,44,
45,46,47,48,49,
50,51,52,53,54,
55,56,57,58,59,
layer 0:
10,5,
5,3.33333,
layer 1:
5,3.33333,
3.33333,2.5,
layer 2:
3.33333,2.5,
2.5,2,
7,3.33333
我的解答思路和尝试过的方法
我认为需要在内部类中即CArray2D类中加入一个什么都不干的析构函数,按我理解来说如果不自己定义的话,那么它将会调用系统生成的析构函数,那么就会将这块地址delete掉,那么按理来说,这个程序就会报错,但是却没有
我想要达到的结果
无