关于指针实现矩阵乘法 析构函数不能使用delete[]开释 不然程序就会停止,具体的是在乘法的时候, 希望大家看看

关于指针实现矩阵乘法 析构函数不能使用delete[]释放 不然程序就会停止,具体的是在乘法的时候, 希望大家看看
下面是采用VS2010中VC++编写的矩阵类,实现了基本的乘法操作,郁闷的是,由于矩阵大小是由构造函数动态分配的内存空间,在实现矩阵乘法时,返回的矩阵对象成了局部堆栈对象,分配的数据指针为NULL,不知各位大虾有什么好的办法没? 

复制代码

#include <iostream>
#include <cstdlib>
using namespace std;

//矩阵类的声明
class Matrix
{
private: 
    const int ROWS,COLS;
    int **m_matrix;
public:
    Matrix& operator*=(Matrix &mat);
    void Output() const;
    Matrix(int rows,int cols);
    ~Matrix();

    friend inline Matrix operator*(const Matrix &lhs,const Matrix &rhs);
};

//矩阵相乘算法(*)
inline Matrix operator*(const Matrix &lhs,const Matrix &rhs)
{
    //检验前置条件
    if(lhs.COLS != rhs.ROWS)
    {   
        cerr << "ERROR:矩阵相乘必须满足前一个矩阵的列数等于后一个矩阵的行数" << endl;
    }

    //乘积矩阵
    Matrix ret(lhs.ROWS,rhs.COLS);

    //乘积操作
    for(int i=0;i<lhs.ROWS;i++)
    {
        for(int j=0;j<rhs.COLS;j++)
        {
            for(int k =0; k<lhs.COLS;k++)
            {
                ret.m_matrix[i][j] += lhs.m_matrix[i][k]*rhs.m_matrix[k][j]; 
            }
        }
    }

    //返回乘积(ret是堆栈对象,不能返回)
    return ret;
}

//矩阵构造函数,进行了动态内存分配
Matrix::Matrix(int rows = 10, int cols = 10):ROWS(rows),COLS(cols)
{
    m_matrix = new int*[ROWS];
    for(int i=0;i<ROWS;i++)
    {
        m_matrix[i] = new int[COLS];
        for(int j=0;j<COLS;j++)
        {
            m_matrix[i][j] = rand() % 100;
        }
    }
}

//矩阵析构函数,释放动态分配的内存, 实际中遇到
Matrix::~Matrix()
{
    for(int i=0;i<ROWS;i++)
    {   
        delete[] m_matrix[i];
    }
    delete[] m_matrix;
}

//矩阵打印函数,打印出矩阵的内容
void Matrix::Output() const
{
    for(int i=0;i<ROWS;i++)
    {
        for(int j=0;j<COLS;j++)
        {
            cout << m_matrix[i][j] << "\t";
        }
        cout << endl;
    }
}    

实际中遇到矩阵的乘法就会停止运行,很烦恼,所以不敢释放空间
------解决思路----------------------
乘法里面的ret是局部变量,函数返回的时候就会对他调用析构函数,释放指针空间。所以浅拷贝得到的返回值只能得到非法的指针。
深拷贝的拷贝构造函数,大致就是这样,楼主自己调试一下吧:
Matrix::Matrix(const Matrix& m)
{
    ROWS = m.ROWS;
    COLS = m.COLS;
    m_matrix = new int*[ROWS];
    for(int i=0;i<ROWS;i++)
    {
        m_matrix[i] = new int[COLS];
        for(int j=0;j<COLS;j++)
        {
            m_matrix[i][j] = m.m_matrix[i][j];
        }
    }
}