gpt4 book ai didi

c++ - 为什么我的赋值运算符不能用于自赋值?

转载 作者:太空狗 更新时间:2023-10-29 23:45:28 26 4
gpt4 key购买 nike

当我做类似 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/

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