class a
{
private:
std::shared_ptr <std::string> sptr;
public:
void set(std::string & ref)
{
sptr = &ref; //error
}
};
解决方法是什么?我需要保留引用作为参数,我需要私有指针为shared_ptr。将std :: shared_ptr设置为指向参考
class a
{
private:
std::shared_ptr <std::string> sptr;
public:
void set(std::string & ref)
{
sptr = &ref; //error
}
};
解决方法是什么?我需要保留引用作为参数,我需要私有指针为shared_ptr。将std :: shared_ptr设置为指向参考
要将新的原始指针赋值给一个共享指针,并使共享的指针取得所有权,使用成员函数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);
如果它不是'std :: string',而是一个可以更改的自定义类,请考虑['std :: enable_shared_from_this'](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)。 – 2013-02-22 13:05:49
@ArneMertz:是的,但这是相当微妙和专业。你必须完全设计这个类,因为它从一开始就被共享指针所拥有。尽管适当的话,这是一个好主意! – 2013-02-22 13:14:26
如果你想存储你参考的地址,如果你想存储新的对象,那么你可以使用
sptr = std::shared_ptr<std::string>(&ref, [](const std::string*){});
否则 - 使用Kerrek SB变种。
这是有效的,但它强加了一个关键的不成文和非局部的假设,即参考文献超过了'a'对象的所有副本。 – 2013-02-22 12:55:07
'shared_ptr'在没有删除器的情况下变得相当无用。这只是一个非拥有的参考(应该使用什么原始指针)。它唯一提供的是weak_ptrs可以检查对象是否仍然存在,但是如果它们被锁定,它们实际上不会延长生命期。没有人延长寿命。 – David 2013-02-22 12:56:30
@Kerrek SB谢谢。你可以用它做出答案。 – user1873947 2013-02-22 12:50:13