std :: shared_ptr在复制对象时导致问题

时间:2014-02-20 16:49:23

标签: c++ c++11

我有一个有shared_ptr成员的班级。此类的构造函数采用分配给其成员的shared_ptr对象。现在问题是,如果我将此对象分配给同一个类的另一个对象,则两者都指向相同的shared_ptr。我不想这样做。下面的代码类似于我的代码,但是当我执行赋值时,它会在shared_ptr交换时崩溃。请帮助我按照我想要的方式工作。

如果执行行obj2 = * obj1,你可以看到,新的shared_ptr在构造函数中创建,然后调用赋值,其中swap将获取rhs上的temp shared_ptr并最终以递归方式查找堆栈。

class A
{
public:
virtual ~A(){};
virtual void Test()
{
}
int i;
int j;
};

class C:public A
{
public:

void Test()
{
}

};


class B
{
 public:
B::B(const B& rhs) : m_Command(std::make_shared<A>(*rhs.m_Command)) 
{


}
B::B(B&& rhs) : m_Command(std::move(rhs.m_Command)) 
{

}
B& B::operator=(B rhs) 
{
    std::swap(*this, rhs);
    return *this;
}

B()
{

}

B(std::shared_ptr<A> command)
{
    m_Command=command;
}
void Test()
{

}
std::shared_ptr<A> m_Command;
};

int _tmain(int argc, _TCHAR* argv[])
{
std::shared_ptr<A> cmd(new C());
B *obj1=new B(cmd);
B obj2;
obj2=*obj1;
cmd->i=10;
cmd->j=20;



return 0;
}

1 个答案:

答案 0 :(得分:1)

如果std::make_shared<A>(*rhs.m_Command)为空,

rhs.m_Command将会失败。