如何制作包含共享指针列表的对象的副本?

时间:2014-08-26 16:13:06

标签: c++ copy shared-ptr

我想从下面的类中复制一个对象:

class EventPacket
{

public:
    std::list<std::shared_ptr <Event> >::iterator it;
    std::list<std::shared_ptr <Event> > EventList;
    EventPacket();
    ~EventPacket();

    EventPacket* clone();

    void add(std::shared_ptr<Event> event);
    std::shared_ptr<Event> pop();

    std::list<std::shared_ptr <Event> >::iterator begin(void);
    std::list<std::shared_ptr <Event> >::iterator end(void);
};

因此,我实施了以下功能:

EventPacket* EventPacket::clone() {
EventPacket *copy = new EventPacket();
*copy = *this;
return copy;

}

它编译并且似乎运行但是我不确定共享指针是否被正确复制,以便它们在复制的对象中保持共享指针。比方说,如果我复制一个对象Eventpacket* ep(假设其Eventlist包含许多Event个对象)并在之后删除该副本

EventPacket *copy = ep->clone();
delete copy;

是否会自动发布事件列表,就像人们从共享指针列表中预期的那样?

3 个答案:

答案 0 :(得分:4)

  
    

但是我不确定共享指针是否被正确复制,以便它们在复制的对象中保持共享指针

  

他们是。

复制shared_ptr会将引用计数增加一,因此在您的示例中,删除copy将不会释放事件,但一旦ep也被删除,他们就会。

请记住,克隆的EventPacket与原始对象共享Event个对象,这可能是也可能不是。

答案 1 :(得分:3)

你应该直接复制课程,即

EventPacket eventPacket;
// Do stuff 
EventPacket copy = eventPacket;

因为您的课程无需任何进一步操作即可复制。实际上,如果可能的话,编译器会生成一个复制构造函数(适当地称为隐式),如果可能的话(例如,如果您的类可以被轻易复制,那么这就是每个私有的情况) member定义了一个拷贝构造函数)。

然后,共享指针将被正确复制,该类基本上用于处理这种情况。共享指针可以根据需要传递和复制,同时指向相同的内存,并且保证在没有来自任何生命对象/函数的引用时完全删除。

答案 2 :(得分:1)

复制列表将复制共享指针,共享Event个对象的所有权。从两个列表中删除它们时将被删除。

隐式复制构造函数和赋值运算符将执行此操作。在您的代码中,这通过*copy = *this中的分配发生。在更明智的代码中,

EventPacket copy = ep;

复制构造函数复制所有共享指针。

相关问题