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

标签 c++ operator-overloading assignment-operator

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

相关文章:

c++ - 更新 DATETIME 导致 BB10 上的 sqlite 错误

c++ - "ambiguous overload for ' operator<< '"*without* a catch-all overload

javascript - 赋值操作总是从右向左复制数据吗?

android - 使用 NDK 访问 Android 摄像头

c++ - boost::lockfree::queue 在 c++11 中不是无锁的吗?

c++ - 将字符串从 __DATE__ 转换为 time_t

c++ - 重载 operator= 作为非成员

c++ - 类内声明的友元运算符中左手参数的隐式转换

c++ - VS2013更新到VS2019导致左值错误,想了解原因

c++ - 在具有智能指针的类上正确实现复制构造函数和等于运算符