2010-11-15 34 views
0

我的程序崩潰了,我正在爲了崩潰而不知所措。主要的問題是wxwidgets文檔說引用計數用於wxImage對象。這到底是什麼意思?爲什麼這段代碼會崩潰?wxWidgets中的引用計數,它在這種簡單情況下如何工作?

wxImage* t = m_default_image; //m_default_image is a pointer pointing to a valid wxImage object. 

wxDELETE(m_default_image); 
if(t->IsOk()) 
{ 
    wxLogMessage("reference counting works!"); 
} 

崩潰的行是t-> IsOK()。不應該引用計數阻止實際的對象被刪除,所以我的ttr仍然指向有效的東西?

回答

1

讓我解釋發生了什麼:

  1. 您創建一個指向您已經某處創造了一個wxImage。
  2. 然後您將其刪除。
  3. 然後,您嘗試取消引用已刪除的指針,並且因爲上一步,因此不再存在的結果對象上調用'IsOk()'。

步驟2可能或可能沒有真正刪除該對象,但它也可能刪除該引用。根據wx如何實現引用計數以及如何管理引用,wxImage對象在例程開始時可能引用計數爲1,因此,wxDELETE將引用計數減少爲零,因此將對象刪除爲好。

如果您使用的是指針,wx無法使用引用計數自動管理對象。也許你想使用複製構造函數,並停止使用手動內存處理? C++有RAII技術 - 使用它。

最後,我可以問爲什麼m_default_image是一個指針?通過始終使用原始指針,您只會讓自己難過。

0

爲了增加Arafangion的答案(我只想評論,如果我有足夠的代表處點,這樣做的),如果你讀了wxDELETE()的文件,你會看到,它實際上說:

該函數使用操作符delete來釋放指針並將其設置爲NULL。

C++指針沒有任何與引用計數的在wxWidgets中實現(我不認爲它在其他地方使用智能指針時除外),並作爲wxDELETE是爲了與使用指針,它也與引用計數完全無關,只不過它刪除了可能引用計數或可能不引用計數的對象,如果引用計數大於1,且對象引用計數大於1,則該對象確實未被刪除但是,你的指針是仍然無效。

0

引用計數在內部使用wxImage對象這意味着您可以便宜地複製它們,因爲底層圖像數據是共享的。它沒有暴露在wx API中,並且與wxImage指針絕對沒有任何關係。

相關問題