最最快乐的人 2022-04-09 14:01 采纳率: 100%
浏览 14
已结题

关于内部类使用的一些疑惑

问题遇到的现象和发生背景

题目:实现一个三维数组模版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掉,那么按理来说,这个程序就会报错,但是却没有

我想要达到的结果

  • 写回答

2条回答 默认 最新

  • [PE]经典八炮 2022-04-09 14:29
    关注

    析构函数与释放内存没有半点关系,析构函数不会清空自身的内存,你可以在里面添加一些清理的代码(比如释放成员变量内存),你如果不写析构函数等于生成了一个空的析构函数。是释放内存引发调用析构函数,而不是调用析构函数来释放内存。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月17日
  • 已采纳回答 4月9日
  • 创建了问题 4月9日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)