Shn*_*hnd 0 c++ destructor equals-operator
我有一个名为Matrix的类,带有2维指针bool**矩阵.
看看这段代码:
void Matrix::operator=(const Matrix& A){
cout << "address in A : " << A.matrix << endl ;
cout << "address in y : " << matrix << endl ;
//return *this;
}
Run Code Online (Sandbox Code Playgroud)
我在我的main函数中调用了我的=运算符,如下所示:
Matrix x(3,5);
Matrix y(3,5);
x.set(1,4,1);
cout << "address out X: " << x.matrix << endl;
cout << "address out Y: " << y.matrix << endl;
y = x;
cout << "address out X: " << x.matrix << endl;
cout << "address out Y: " << y.matrix << endl;
Run Code Online (Sandbox Code Playgroud)
析构函数是这样的:
Matrix::~Matrix(){
cout << "address de : " << matrix <<endl;
for (int i=0;i<m;i++)
delete[] matrix[i];
delete[] matrix;
cout << "address de finish : " << matrix <<endl;
}
Run Code Online (Sandbox Code Playgroud)
当我在xcode中运行我的程序时,我得到:
address out X: 0x100103ab0
address out Y: 0x100103af0
address in A : 0x100103ab0
address in y : 0x100103af0
address out X: 0x100103ab0
address out Y: 0x100103af0
address de : 0x100103af0
address de finish : 0x100103af0
address de : 0x100103ab0
address de finish : 0x100103ab0
Run Code Online (Sandbox Code Playgroud)
它看起来很好但是当我更改=运算符函数时:
Matrix Matrix::operator=(const Matrix& A){
cout << "address in A : " << A.matrix << endl ;
cout << "address in y : " << matrix << endl ;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
address out X: 0x100103ab0
address out Y: 0x100103af0
address in A : 0x100103ab0
address in y : 0x100103af0
address de : 0x100103af0
address de finish : 0x100103af0
address out X: 0x100103ab0
address out Y: 0x100103af0
address de : 0x100103af0
Thesis(26190) malloc: *** error for object 0x100103b10: pointer being freed was not allocated
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么析构函数会在后一个代码中更快触发?我该如何防止它
先感谢您
原因是您的修改后的复制赋值运算符按值返回,该值创建矩阵的副本,返回矩阵,然后销毁它.
您的复制赋值运算符的规范签名将是Matrix& Matrix::operator=(const Matrix& A)(请注意,我通过非const引用返回).
编辑:请记住,如果您只是使用vector所有这些内存管理只是消失,所有这些功能可以使用编译器默认值.虽然如果你实际上将bools 存储在矩阵中,那么它vector<bool>是专门的,你应该确保你理解该特化与代码的交互方式.