我有一个有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;
}
答案 0 :(得分:1)
std::make_shared<A>(*rhs.m_Command)
为空, rhs.m_Command
将会失败。