簡體   English   中英

提升Shared_Ptr分配

[英]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獲取堆棧上對象的所有權。 然后會發生兩件事:

  1. shared_ptr達到引用計數0之前,對象的堆棧幀被清除。在這種情況下, shared_ptr將嘗試稍后刪除某個不存在的對象,從而導致未定義的行為。
  2. 在清除堆棧幀之前, 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)通過所有權&lisshared_ptr ,而“所有權”指shared_ptr將調用delete其指針對象時的最后一個副本shared_ptr超出范圍。 所以你有效地刪除了一個本地(堆棧)變量 - lis - 它會破壞堆棧並導致崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM