2013-03-03 65 views
0

我有以下應用程式結構:BOOST共享指針導致冗餘參考刪除

/// CLASS VIEW3D.h 
class View3D; 
typedef boost::shared_ptr<View3D>  ViewSP; 
class View3D 
{ 

public: 
    View3D(void); 


    }; 

/// CLASS SCREENQUAD.h 

class ScreenQuad 
{ 
public: 
    ScreenQuad(ViewSP view); 

    ~ScreenQuad(void); 
    protected: 
    ViewSP _viewSP; 




}; 
/// CLASS VIEW3D.cpp 
    View3D::Init(ViewSP view) 

{ 

    _screenQuadSP=new ScreenQuad(view); 

} 

/// CLASS SCREENQUAD.cpp

ScreenQuad::ScreenQuad(ViewSP view): 

    _viewSP(view)   
{ 
    assert(_viewSP); 

} 

現在,我通過A類的參考成B類以共享指針的形式並將其保存在全局變量A_SP中。當應用程序拍攝下來我得到這個:

HEAP: Free Heap block 2837920 modified at 2837b5c after it was freed 

調試我發現,類A析構函數被調用後,它被再次調用時B類的析構函數是執行後executed.So我的猜測是,該提升嘗試釋放指針封裝在中的地址處的內存。 只需注意:破壞的順序是A第一類,然後B類。

我該如何解決它?不應該shared_ptr保持引用計數並且不觸發已經釋放的對象的析構函數?

+2

您能否提供一個簡短的可編譯示例來重現您描述的行爲? – us2012 2013-03-03 12:25:59

+1

錯誤很多:分號丟失,導致下劃線 - 大寫字母保留... – 2013-03-03 12:26:02

+0

好吧,它只是一個僞代碼... – 2013-03-03 12:26:25

回答

3

您的代碼仍然不完整,不能顯示問題,但我可以考慮導致此類錯誤的一些常見原因。

  • 您明確delete您的View3D實例的某處。不要那樣做,shared_ptr會。如果您不再需要該對象,則可以調用ptr.reset(),這將減少其引用計數並在適當的情況下將其刪除。 (這當shared_ptr被破壞,例如,在你的析構函數ScreenQuad自動發生;在這種情況下,有沒有必要做作了明確規定。)

  • 您無意中創建多個引用計數器爲同一對象。從View3D*原始指針創建shared_ptr時,應該只有一個位置,即在創建對象的相同位置。在其他地方,您必須從其他共享(或弱)指針創建共享指針。否則,最終會得到多個引用計數器,並且每個引用計數器最終都會嘗試刪除該對象,即使它已經被釋放。

  • 您創建了一個shared_ptr到堆棧上的對象。實質上,這與在堆棧分配對象上調用delete的問題相同。

這可以幫助你發現自己的錯誤,否則你真的需要發佈更多的代碼 - 據我什麼都看不見這一切都發生在你表現出迄今爲止片段。

+0

我懷疑這是我的問題:「您意外地爲同一個對象創建了多個引用計數器。應該只有一個位置,您可以從View3D *原始指針創建shared_ptr,即創建該對象的地方。 – 2013-03-03 14:48:20