gpt4 book ai didi

在重载算术运算符中调用 C++ 析构函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:51 24 4
gpt4 key购买 nike

我有一个为神经网络程序和重载算术运算符定制的矩阵库。这是类声明:

class Matrix{
public:
int m;
int n;
double **mat;
Matrix(int,int);
Matrix(int);
Matrix(const Matrix& that):mat(that.mat),m(that.m),n(that.n)
{
mat = new double*[m];
for(int i = 0;i<m;i++)mat[i] = new double[n];
};
~Matrix();
friend istream& operator>>(istream &in, Matrix &c);
friend ostream& operator<<(ostream &out, Matrix &c);
Matrix operator+(const Matrix& other);
};

这是 + 操作的函数定义:

 Matrix Matrix::operator+(const Matrix& other)
{
Matrix c(m,n);
for(int i=0;i<m;i++)
{
for(int j = 0; j<n;j++)
c.mat[i][j] = mat[i][j] + other.mat[i][j];
}
return c;
}

我已经尝试以各种方式实现它并且错误是相同的......这是一个实例

Matrix x(m,n); //m and n are known
x = a+b; // a and b are also m by n matrices

我已经使用断点调试了代码,这里是错误...运算符函数中的局部矩阵“c”在返回之前被销毁因此分配给 x 的是一个垃圾指针..

请给我一些建议...

最佳答案

您需要为您的类定义一个复制构造函数。复制构造函数需要为 mat 分配内存并复制数据。

如果没有这个,当您返回c时,将构造一个新对象,该对象具有与c 相同的mat 值。当 c 随后超出范围时,它会删除 c.mat。结果,c 的拷贝留下了悬空指针。

完成此操作后,您还应该实现一个赋值运算符。

关于在重载算术运算符中调用 C++ 析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com