class a
{
private:
std::shared_ptr <std::string> sptr;
public:
void set(std::string & ref)
{
sptr = &ref; //error
}
};
解决方案是什么?我需要保持引用作为参数,我需要私有指针为shared_ptr。
答案 0 :(得分:7)
要为共享指针分配新的原始指针并使共享指针获得所有权,请使用成员函数reset
:
std::shared_ptr<Foo> p;
p.reset(new Foo);
共享指针共享对象的所有权,因此几乎不可能在任意引用上明智地拥有sptr
份额所有权。 (例如sptr.reset(&ref)
几乎肯定是完全错误的。)适当的做法是制作一个新的字符串副本,即sptr.reset(new std::string(ref))
或更好:
sptr = std::make_shared<std::string>(ref);
答案 1 :(得分:2)
如果您想存储参考地址,可以使用
sptr = std::shared_ptr<std::string>(&ref, [](const std::string*){});
否则,如果要存储新对象 - 请使用Kerrek SB变体。