u011396790
haha_318
采纳率100%
2014-05-27 10:55 阅读 976

急!!!在线等各位大神解答!!!析构函数何时被执行

我写了一个矩阵类,其中想要实现乘法的重载,下面是我的具体实现:

  //重载矩阵与矩阵乘法运算
CMatrix CMatrix::operator *(CMatrix &M2)
{
    CMatrix temp;
    temp.initialize(m_row,M2.m_col);//矩阵初始化
    for(int i=0; i<m_row; i++)
    {
        for(int j = 0; j < M2.m_col; j++){
            for(int k = 0; k < m_col; k++){
                temp.m_pData[i][j] = temp.m_pData[i][j] + m_pData[i][k] * M2.m_pData[k][j];
            }
        }
    }
    temp.print();
    return temp;
}

在上面的代码中,我定义了一个temp临时变量,因为temp在初始化的时候已经分配了一定的空间,我希望能够在执行完乘法之后把这部分空间释放,所以就定义了一个析构函数,如下:

CMatrix::~CMatrix()
{
    for(int _i=0;_i<m_row;_i++)
        delete []m_pData[_i];
    delete []m_pData;
}

但是输出的时候又错误,我想问一下这个析构函数是在执行return temp之后执行的还是再此之前就执行了啊~
为什么return返回的矩阵式空的啊~

//动态创建二维数组
#define matrix_allocate(m,w,h,TYPE) { m=new TYPE*[h + 1];for(int _i=0;_i<h;_i++){int t=_i-1;m[_i]=new TYPE[w +1];if(!m[_i]) _i = t;}}
//动态删除二维数组
#define matrix_delete(m,w,h) { for(int _i=0;_i<h;_i++) delete[]m[_i]; delete[]m;}
//矩阵初始化函数
bool CMatrix::initialize(int r,int c)
{
    m_row=r;
    m_col=c;
    matrix_allocate(m_pData,m_col,m_row,double);
    m_pData[0][0] = 123;
    for(int i=0; i < m_row; i++)
    {
        for(int j = 0; j < m_col; j++)
            m_pData[i][j] = 0;
    }

    return true;
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • cangyue080180 独孤侠客 2014-05-27 13:49

    楼主你可以调试看看啊,析构函数应该不会在return之前执行,如果你不是很确定可以把析构函数里的删除temp去掉,因为语言自动处理资源回收不用你操心。

    点赞 评论 复制链接分享
  • jy02684358 jy02684358 2014-05-28 02:55

    CMatrix temp;把这个改为参数传进去,应该就可以解决你的问题。
    构造函数是在定义的时候调用的,析构函数是在有效区域结束的时候调用的,你现在的情况
    CMatrix temp的有效区域在CMatrix CMatrix::operator *(CMatrix &M2)函数内,也就是出了这个函数这个东西就被析构了。

    点赞 评论 复制链接分享
  • lym753024200 风浪静 2014-05-28 04:01

    奇怪,我昨天晚上的回答谁被删除了?楼主要重新选择下正确答案。

    点赞 评论 复制链接分享
  • wbteric wbteric 2014-05-29 08:33

    你要给CMatrix写复制构造函数和operator=,因为return temp的时候构造了一个新的CMatrix对象,默认的复制构造函数是不会复制m_pData指向的内容的

    点赞 评论 复制链接分享

相关推荐