C++ 如何正确复制给定共享\u ptr的对象

C++ 如何正确复制给定共享\u ptr的对象,c++,shared-ptr,copy-constructor,C++,Shared Ptr,Copy Constructor,我正在尝试复制自定义类事件的对象。我有一个指向从其分配中获得的对象的共享指针: std::shared_ptr<Event> e = std::make_shared<Event>(); 但我不确定这是否正确,因为如果我删除e,它似乎也会删除o 顺便说一句,我还没有定义复制构造函数Event::Event(const-Event&orig),但据我所知,这并不是必需的,因为编译器提供了一个默认的复制构造函数。事件类只包含变量,没有进一步的指针。如果*e的动态类型是eve

我正在尝试复制自定义类
事件
的对象。我有一个指向从其分配中获得的对象的共享指针:

std::shared_ptr<Event> e = std::make_shared<Event>();
但我不确定这是否正确,因为如果我删除
e
,它似乎也会删除
o


顺便说一句,我还没有定义复制构造函数
Event::Event(const-Event&orig)
,但据我所知,这并不是必需的,因为编译器提供了一个默认的复制构造函数。事件类只包含变量,没有进一步的指针。

如果
*e
的动态类型是
event
,而不是从
event
派生的某个类,那么您尝试的应该可以正常工作。(如果
*e
实际上是从
事件
派生的对象,那么您将创建一个新的
事件
(不是派生类型)作为
*e
的基类部分的副本,即您将“切片”
*e


由于您使用
make_shared()
创建
e
,您知道在这种情况下它实际上是一个
事件,因此
std::make_shared(*e)
应该创建一个新的
shared_ptr
,它拥有
*e
std::make_shared
的副本,它只是一个创建对象的简单模板函数,将所有参数传递给构造函数:

template<class T, class... Args>
shared_ptr<T> make_shared(Args&&... args)
{
  return shared_ptr<T>( new T( std::forward<Args>( args )... ) );
}
模板
共享\u ptr使\u共享(Args&…Args)
{
返回共享的ptr(新的T(标准::转发(参数)…);
}
在您的特殊情况下:

std::shared_ptr<Event> o = std::make_shared<Event>(*e);
std::shared_ptr o=std::make_shared(*e);
对象被复制

如果您的代码是这样的:

void foo() {
    // create new object using default constructor
    std::shared_ptr<Event> e = std::make_shared<Event>();
    // create new object using copy constructor constructor
    std::shared_ptr<Event> o = std::make_shared<Event>(*e);
}
void foo(){
//使用默认构造函数创建新对象
std::shared_ptr e=std::make_shared();
//使用复制构造函数创建新对象
std::shared_ptr o=std::make_shared(*e);
}

当然,当它们超出范围时,这两个对象都会被销毁。

似乎
e
也会删除
o
?为什么呢您可以添加带有print语句的析构函数来查看发生了什么。您可以将日志放入事件析构函数中。例如,std::cout.make_shared()是否必须使用新对象进行复制?或者它会在可能的情况下移动对象吗?@量子物理学家在
foo()
中的第二行使用复制构造函数创建了一个新对象-它不会移动我遇到了您描述的问题。如何从另一个共享类到基类创建共享类到基类的副本,同时保留它实际上是派生类的事实?到目前为止,我最好的解决方案是:“代码”std::shared\u ptr newBase;派生的copiedJob=*static_cast(obj.mp_base.get());newBase=std::使_共享(复制作业);'\代码'@Ironalway使用
`
作为内联代码标记,而不是“代码”。看见
void foo() {
    // create new object using default constructor
    std::shared_ptr<Event> e = std::make_shared<Event>();
    // create new object using copy constructor constructor
    std::shared_ptr<Event> o = std::make_shared<Event>(*e);
}