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

解决方法是什么?我需要保留引用作为参数,我需要私有指针为shared_ptr。将std :: shared_ptr设置为指向参考

+0

@Kerrek SB谢谢。你可以用它做出答案。 – user1873947 2013-02-22 12:50:13

回答

7

要将新的原始指针赋值给一个共享指针,并使共享的指针取得所有权,使用成员函数reset

std::shared_ptr<Foo> p; 

p.reset(new Foo); 

共享指针对象的股份所有权,所以它几乎是不可能的让你的sptr明智地分享所有权的任意参考。 (例如sptr.reset(&ref)几乎肯定会COM ­ pletely错了。)适当的事是使字符串的新副本,即无论是sptr.reset(new std::string(ref)),或更好:

sptr = std::make_shared<std::string>(ref); 
+0

如果它不是'std :: string',而是一个可以更改的自定义类,请考虑['std :: enable_shared_from_this'](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)。 – 2013-02-22 13:05:49

+2

@ArneMertz:是的,但这是相当微妙和专业。你必须完全设计这个类,因为它从一开始就被共享指针所拥有。尽管适当的话,这是一个好主意! – 2013-02-22 13:14:26

2

如果你想存储你参考的地址,如果你想存储新的对象,那么你可以使用

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

否则 - 使用Kerrek SB变种。

+0

这是有效的,但它强加了一个关键的不成文和非局部的假设,即参考文献超过了'a'对象的所有副本。 – 2013-02-22 12:55:07

+3

'shared_ptr'在没有删除器的情况下变得相当无用。这只是一个非拥有的参考(应该使用什么原始指针)。它唯一提供的是weak_ptrs可以检查对象是否仍然存在,但是如果它们被锁定,它们实际上不会延长生命期。没有人延长寿命。 – David 2013-02-22 12:56:30