编写类的复制构造函数会在析构函数中删除对象时发生意外崩溃

时间:2014-03-02 08:23:16

标签: c++ copy-constructor

为类创建复制构造函数会在析构函数中删除对象时发生意外崩溃。请参阅以下代码:

class ordinaryClass  // Sample class is used in Foo class
{
public:
    ordinaryClass(){}
};

class Foo
{
public:
    Foo():_ordinarayClass(0)
    {
        _ordinarayClass = new ordinaryClass();
    }

    ~Foo()
    {
        delete _ordinarayClass; // the program crashes here when copy constructor is called.
    }

    Foo(const Foo &obj) // copy constructor
    {
        *_ordinarayClass = *obj._ordinarayClass;
    }

    Foo& operator=(const Foo& other) // copy assignment
    {
        *_ordinarayClass = *other._ordinarayClass;
        return *this;
    }

    ordinaryClass *_ordinarayClass;
};

主要是,如果我写这些代码:

Foo container2;
Foo container;
container = container2;

程序正常运行并正常退出。 但是如果我按照以下方式写它:

Foo container2;
Foo container = container2;

程序在exites时崩溃。我发现程序在Foo类的析构函数中崩溃了。 我在复制构造函数中犯了什么错误吗? 非常感谢。

1 个答案:

答案 0 :(得分:2)

您的需求对象。不要只是复制指针。我将保存“你应该使用智能指针”这个演讲,因为在这个网站上花费的任何时间都会让你在短时间内在你的眼皮上留下纹身(你应该,顺便使用智能指针= P)< / p>

class Foo
{
public:
    Foo() : _ordinaryClass(new ordinaryClass())
    {
    }

    virtual ~Foo()
    {
        delete _ordinaryClass;
    }

    Foo(const Foo &obj) : _ordinaryClass(new ordinaryClass(*obj._ordinaryClass))
    {
    }

    // copy/swap idiom for assignment. the value-parameter is
    //  intentional. think about what it does (hint: copy-ctor)
    Foo& operator=(Foo other)
    {
        this->swap(other);
        return *this;
    }

private:
    ordinaryClass *_ordinaryClass;

    // they get our cruft, we get theirs.
    void swap(Foo& other)
    {
        std::swap(_ordinaryClass, other._ordinaryClass);
    }
};

我会认真重新考虑该成员是否应该首先是动态的,顺便说一句。