当我做类似 a = b 的事情时它工作正常,但如果我做 a = a,我得到 vector 中所有元素的 -1.255 +-67。这是我的复制构造函数和赋值运算符:
VecXd(const VecXd &source){
dimension = source.dimension;
vector = new T[dimension];
for(int i=0; i < dimension; i++)
vector[i] = source.vector[i];
}
VecXd operator=(const VecXd &source){
dimension = source.dimension;
vector = new T[dimension];
for(int i=0; i < dimension; i++)
vector[i] = source.vector[i];
return *this;
}
最佳答案
这是因为一旦您分配了一个新 vector ,您就失去了 source.vector 的先前值。这是一个自赋值,所以 source 和 *this 指的是同一个对象,因此 vector 和 source.vector 是同一个对象。
您可以修复此问题以及内存泄漏,如下所示:
VecXd operator=(const VecXd &source){
dimension = source.dimension;
T *temp = new T[dimension]; // Don't loose source.vector yet
for(int i=0; i < dimension; i++)
temp[i] = source.vector[i];
delete [] vector; // Delete old vector
vector = temp;
return *this;
}
更好的是,您可以防止自赋值以防止这种讽刺:
VecXd operator=(const VecXd &source){
if(this == &source)
return *this; // This is a self-assignment, so there's nothing to do
delete [] vector; // Delete old vector
dimension = source.dimension;
vector = new T[dimension]; // Now we are sure that vector and source.vector differ
for(int i=0; i < dimension; i++)
vector[i] = source.vector[i];
return *this;
}
关于c++ - 为什么我的赋值运算符不能用于自赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18861900/