1
class a
{
private:
  std::shared_ptr <std::string> sptr;
public:
  void set(std::string & ref)
  {
   sptr = &ref; //error
  }
};

解决方案是什么?我需要将引用保留为参数,并且我需要将私有指针设为 shared_ptr。

4

2 回答 2

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);
于 2013-02-22T12:52:24.370 回答
2

如果要存储参考地址,则可以使用

sptr = std::shared_ptr<std::string>(&ref, [](const std::string*){});

否则,如果您想存储新对象 - 使用 Kerrek SB 变体。

于 2013-02-22T12:49:41.513 回答