编写深拷贝 - 复制指针值

时间:2009-12-20 20:35:20

标签: c++ copy pointers

在为包含动态分配内存的指针的类编写复制构造函数时,我有一个问题。

如何指定我希望将复制的对象的指针值复制到复制到对象的指针。显然这样的事情不起作用......

*foo = *bar.foo;

因为,正在删除bar对象(首先复制对象的目的),这只是复制到对象的foo指向同一个地方。

这里有什么解决方案?如何获取动态分配的内存的值,并将其复制到不同的地址?

3 个答案:

答案 0 :(得分:19)

您分配新对象

class Foo
{
    Foo(const Foo& other)
    {
        // deep copy
        p = new int(*other.p); 

        // shallow copy (they both point to same object)
        p = other.p;
    }

    private:
        int* p;
};

答案 1 :(得分:2)

我认为你的班级看起来像这样。

class Bar {
   Foo* foo;
   ...
}

要进行深层复制,您需要创建'bar.foo'引用的对象的副本。在C ++中,只需使用new运算符来调用类Foo的复制构造函数即可:

Bar(const Bar & bar)
{
    this.foo = new Foo(*(bar.foo));
}

注意:此解决方案委托决定复制构造函数new Foo(constFoo&)是否也对Foo类的实现执行“深层复制”...为简单起见,我们假设它做'正确的事'!

[注意......写的问题非常混乱 - 它要求'从对象复制的'指针的值'听起来像是一个深拷贝给我:听起来像一个浅拷贝,即这个。

Bar(const Bar & bar)
{
    this.foo = bar.foo;
}

我认为这只是提问者的无辜混淆,并且需要深层复制。]

答案 2 :(得分:1)

我没有看到上下文,但是您发布的代码似乎不像复制指针一样,它正是您要求的 - 复制它指向的任何内容。前提是foo指向分配的对象。