我有一个名为Matrix的类,带有2维指针bool **矩阵。
看看这段代码:
void Matrix::operator=(const Matrix& A){
cout << "address in A : " << A.matrix << endl ;
cout << "address in y : " << matrix << endl ;
//return *this;
}
我在我的主函数中调用了我的=运算符,如下所示:
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;
析构函数是这样的:
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;
}
当我在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
它看起来很好,但当我改变=运算符函数时:
Matrix Matrix::operator=(const Matrix& A){
cout << "address in A : " << A.matrix << endl ;
cout << "address in y : " << matrix << endl ;
return *this;
}
我得到了这个结果:
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
任何人都可以向我解释为什么析构函数会在后一个代码中更快触发?以及如何防止它
提前谢谢
答案 0 :(得分:7)
原因是您的修改后的复制赋值运算符按值返回 ,它会创建矩阵的副本,将其返回,然后将其销毁。
复制赋值运算符的规范签名为Matrix& Matrix::operator=(const Matrix& A)
(请注意,我是通过非const引用返回的。)
编辑:请记住,如果你只使用vector
所有这些内存管理就会消失,所有这些函数都可以使用编译器默认值。虽然如果您实际上将bool
存储在矩阵中,vector<bool>
是专门的,您应该确保了解该专业化如何与您的代码交互。
答案 1 :(得分:3)
您的赋值运算符按值返回*this
,并复制它。通常,您会返回一个参考:
Matrix& Matrix::operator=(const Matrix& A)
// ^
使用隐式复制构造函数进行复制,隐式复制构造函数只复制成员指针。你现在有两个对象,他们都认为他们“拥有”分配的内存。 operator=
返回的临时值很快就会被破坏,删除内存,并使y
留下悬空指针;当y
尝试再次删除相同的内存时,会收到错误。
这就是为什么管理资源的类应该遵循Rule of Three,以确保它们可以安全地复制。标准容器如std::vector
执行此操作;这通常是一个好主意,而不是自己管理记忆。