Matrix &Matrix::operator*(Matrix &rhs) {
if (this->columns != rhs.rows) {
this->~Matrix();
return *this;
}
else {
Matrix product(this->rows, rhs.columns);
/*for (unsigned int col = 0; col < product.columns; col++) {
for (unsigned int row = 0; row < product.rows; row++) {
unsigned int val = 0;
for (unsigned int i = 0; i < this->columns; i++) {
val += this->get(row, i)*rhs.get(i, col);
}
product.set(row, col, val);
}
}*/
return product;
}
代码构建,但在运行时崩溃。在调试时,我得到错误位于复制构造函数(this->matrix = new double[rows*columns];
)
Matrix::Matrix(const Matrix&m):rows(m.rows),columns(m.columns),matrix(nullptr) {
if (!m.isValid()) {
return;
}
this->matrix = new double[rows*columns];
for (unsigned int i = 0; i < rows*columns; i++) {
matrix[i] = m.matrix[i];
}
}
我不明白为什么?在我实现*
运算符之前,复制构造函数正在运行。我一点一点地评论找出真正的错误,看起来程序因返回产品而崩溃;声明。这就是我已经注释掉了for循环,所以那些不是问题。
我对main的测试很简单:
#include "Source.h"
#include "Matrix.h"
#include<iostream>
int main() {
Matrix A(3,3);
Matrix B(3);
cout << B << endl;
cout << A << endl;
Matrix C=A*B;
cout << C << endl;
return 0;
}
我希望有人能帮助我,因为我真的被困了。 以下是整个计划的链接:
答案 0 :(得分:2)
代码中的operator *
方法返回对局部变量的引用。局部变量product
超出范围并在return
时被销毁,因此您最终返回一个悬空引用,使用它可能最终导致未定义的行为。
operator *
的返回类型应该只是Matrix
而不是Matrix &
:
Matrix Matrix::operator*(Matrix &rhs) { /* ... your code here ... */ }