2009-09-03 74 views
4

我有一個回答中,我描述了捕獲異常困難,當我試圖訪問已釋放由第三方功能的對象previous question。該函數有時會執行並且有時不會釋放該對象。如何確定C++對象是否已被釋放?

爲了避免使用一個try/catch塊捕獲SEH異常如前面所描述的問題,我需要能夠告訴對象是否已釋放或沒有。

如何確定C++對象是否已被釋放或仍然是有效的指針?

+6

如果第三方庫不告訴你該對象是否被刪除,是時候去另一個庫了。 – 2009-09-03 16:23:13

回答

10

你不能簡單的只是通過在存儲器位置看,如果該對象是否仍然分配或不知道。可能有一些黑魔法技巧來做到這一點,但更清潔的方法是建立回撥機制到對象的析構函數。

+0

我不控制對象定義 - 它是從第三方DLL返回的對象。 – 2009-09-03 22:29:22

3

你不能。如果你使用的函數沒有給你方法知道它是否釋放了對象本身,那麼你就無法找到它。

編輯:那麼,除非所討論的對象是自己的類的實例,您可以修改析構象阿德里安建議。

2

我不認爲你可以,至少不會以標準的方式。據我所知,沒有要求堆管理器能夠檢測以前是否返回過地址的情況。

如果有,就沒有必要讓它不確定什麼delete是無效的指針做。

+1

我想你可以重寫malloc並自由實現類似的功能,但這就是我所說的黑魔法...... – 2009-09-03 15:52:07

6

我想你問錯了問題。這個問題真的應該是:

爲什麼我覺得我需要看一些地址,以確定指向那裏的指針指向的是一個對象還是指向一個前對象之後留下的垃圾刪除嗎?

老實說,你不應該在這種情況下。如果一個對象被刪除,爲什麼你留下一個指向其前地址的指針?理想情況下,指針應該超出範圍。如果在你的代碼是不可能的,它應該被設置爲NULL

+2

我會修改你的語句......我不應該放在那個位置上。不幸的是,這是我被第三方代碼放置的位置。有時它釋放它,有時它不會。 – 2009-09-03 22:30:52

+1

Ouch。一個第三方庫有時會把指針指向一個已經被刪除的對象?你不能提交錯誤報告?而lib仍然值得使用?這聽起來像是一個非常糟糕的情況。 – sbi 2009-09-04 10:13:58

+2

在編寫程序的上下文中,這可能是一個錯誤的問題,但在編寫測試單元的上下文中,如果要查明指針是否實際上應該被刪除,這是一個正確的問題。 – tlonuk 2014-02-15 13:37:50

0

如果你控制訪問你的對象的所有代碼,那麼正確的方法是使用boost :: shared_ptr來管理對象的生命週期,然後boost :: weak_ptr對於你期望在對象之後保留的任何引用被刪除。

雖然看着關於第三方庫的其他問題,但可能會被卡住。如果庫是容易刪除對象的其他選項的副作用,那麼很有可能你不打算繼續圍繞這些指針。是否有理由在任何時候都不能重新提取對象,或者至少在做過任何可能已經刪除對象的事情之後?

0

創建於desrtruction通知析構函數。它甚至可以切換一個布爾,如果你想在運行時檢查它。

class free 
{ 

public: 

    ~free() { cout << "Im being freed " << endl; } //destructor output 
}; 

這將在控制檯輸出它被釋放。在被釋放後,任何對它的引用都將是未定義的行爲,即使它看起來存在。