我想从下面的类中复制一个对象:
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;
是否会自动发布事件列表,就像人们从共享指针列表中预期的那样?
答案 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;
复制构造函数复制所有共享指针。