关于指针实现矩阵乘法 析构函数不能使用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];
}
}
}
下面是采用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];
}
}
}