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