2011-05-19 59 views
2

是否有工具可以捕獲堆棧對象的刪除,gcc和Visual Studio調試版本可能會立即在該事件中中斷?捕捉堆棧對象的刪除?

我處理大的舊項目,所以這不是如何編寫代碼的問題,而是如何檢測和修復問題。

+0

你的意思是在基於堆棧的對象上顯式調用'delete'的意義? – 2011-05-19 12:55:12

+1

您是否嘗試過在堆棧對象的類的析構函數中放置一個斷點,或者在堆棧對象即將清理之前的方法末尾? – 2011-05-19 12:56:10

+1

如果該類的所有對象始終位於堆棧上,則可以給它一個私有的,未實現的'operator delete'。 – 2011-05-19 12:58:23

回答

2

大多數堆實現不允許指向無效指針(即,當您的delete地址未由堆返回給您時)。幾乎可以肯定的是標準窗口堆和CRT的堆(由MSVC實現)在這種情況下會產生調試斷點。

你也可以替換new/delete運算符的實現並自己檢查(在你的情況下你只想檢查地址是否屬於堆棧內存,這很容易)。

2

如果您事先設計所有權並在必要時使用智能指針來強制執行,那麼這種情況就不太可能發生。我懷疑他們會做任何事情,但拋出一個通用的壞釋放。

+0

我主要關心它不會拋出的可能性,以縮小尋找問題的幽靈。 – Vasaka 2011-05-19 13:12:48

+0

@q______b:它會立即拋出。它可能不會拋出並告訴你這是問題的具體原因,但它幾乎肯定會拋出。 – Puppy 2011-05-19 13:23:01