[英]Boost Shared_Ptr assignment
為什么我不這樣做?
boost::shared_ptr<QueuList> next;
void QueuList::SetNextPtr(QueuList* Next)
{
boost::mutex mtx;
boost::mutex::scoped_lock lock(mtx);
{// scope of lock
//if (next == NULL) // is this needed on a shared_ptr??
next = Next; // Why can I not assign a raw ptr to a shared_ptr????
}
}
我應該怎么做呢?
編輯:在正確分配下一個變量時調用此方法,當QueuList對象因某種原因被銷毀時仍會導致錯誤。 我得到一個調試斷言。 對象的析構函數沒有做任何特別的事情。 它只在我調用此函數時崩潰:
QueuList li;
QueuList lis;
li.SetNextPtr(&lis);
當main超出范圍時,我得到一個調試斷言......任何想法?
這樣做是為了防止意外地將指針分配給其生命周期獨立管理的shared_ptr
。 您必須顯式創建一個shared_ptr
,然后獲取該對象的所有權。
next = boost::shared_ptr<QueueList>( Next );
編輯您的編輯問題是,在您的情況下, shared_ptr
獲取堆棧上對象的所有權。 然后會發生兩件事:
shared_ptr
達到引用計數0之前,對象的堆棧幀被清除。在這種情況下, shared_ptr
將嘗試稍后刪除某個不存在的對象,從而導致未定義的行為。 shared_ptr
達到引用計數0。 在這種情況下,它將嘗試刪除堆棧中的對象。 我不確切知道在這種情況下會發生什么,但我認為它也是未定義的行為。 您可以使用Reset()函數而不是next = boost::shared_ptr<QueueList>(Next);
next.Reset(Next);
將指針放在shared_ptr
會將指針的所有權轉移到shared_ptr,因此shared_ptr
負責刪除它。 這在概念上是一個重要的操作,因此shared_ptr
的設計者不希望它只是作為看似正常的賦值的一部分發生。 例如,他們想要阻止代碼:
some_shared_ptr = some_other_smart_pointer.get();
看起來相當無害,但這意味着兩個智能指針都認為他們有責任清理指針,並且可能會雙重刪除指針或類似的東西。
這就是您的調試斷言所發生的事情。 調用SetNextPtr(&lis)
通過所有權&lis
的shared_ptr
,而“所有權”指shared_ptr
將調用delete
其指針對象時的最后一個副本shared_ptr
超出范圍。 所以你有效地刪除了一個本地(堆棧)變量 - lis
- 它會破壞堆棧並導致崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.