如何避免拷贝赋值操作符的双重自由或损坏(fasttop)



我有下面的类,我强制编译器生成所有的复制/移动构造函数和赋值操作符。

class foo {
public:
    float *x;
    size_t size;
    foo(int m){
        size = m;
        x = new float[size];}
    foo(const foo&) = default;
    foo(foo&&) = default;
    foo& operator =(const foo&) = default;
    foo& operator =(foo&&) = default;
    ~foo(){delete [] x;}
    void fill(const float& num)
    {
        std::fill(x,x+size,num);
    }
    void print()
    {
        for (auto i=0;i<size;++i)
            cout << x[i] << endl;
        cout << endl;
    }
};

然后我从main函数中调用它,像这样

int main()
{
    foo x(2);
    x.fill(6);
    x.print();

    foo y(2);
    y = x; // causes the error
    return x;
}

现在我知道我通过分配y = x释放了两次内存;一旦一个被释放另一个就是null,对吗?我接着实现了我自己的复制赋值操作符

foo& operator=(const foo& other)
{
    if (other.x!=x)
        x = other.x;
    return *this;
}

然而,我猜这里我又做了默认构造函数正在做的事情。我的问题是如何使一个适当的复制赋值操作符,使这个问题不会发生?

您需要复制的不是指针本身,而是指针的内容。一个好的方法是使用复制和交换习惯用法,因为您的复制构造函数应该已经完成了复制x的内容的工作:

friend void swap(foo& first, foo& second)
{
    using std::swap; 
    swap(first.x, second.x); 
    swap(first.size, second.size);
}
foo& operator=(foo other) // note pass by value
{
    swap(*this, other);
    return *this;
}

相关内容

  • 没有找到相关文章

最新更新