2012-05-18 53 views
0

我試圖反向工程並修復拋出未處理異常的Win32控制檯應用程序。爲什麼我的C++類變量意外地改變了範圍之外?

我有32個在線程中運行的類的實例。這些「服務」線程應該每個定期創建/刪除一個唯一的CMessage實例,並且這些CMessage對象中的每一個都在Service類中聲明爲私有。

當我運行在調試器中的應用程序(我使用Visual Studio 2005)爲的CMessage監視窗口指示被調用的CMessage成員函數權前的CMessage的地址更改爲00000000 - 異常的原因。

有,我可以看到爲什麼發生這種情況沒有直接的解釋。在上一行代碼和這一行之間似乎沒有什麼不愉快的事情發生,所以我懷疑在某些情況下每個線程都錯誤地從其他線程之一引用CMessage對象(就像在線程生命週期中的某個時刻CMessage該線程的對象被刪除)。

我的問題是:什麼是要確保這些的CMessage對象absoloutely線程安全的,不能修改/從任何地方刪除,除了當前類範圍的最佳方式?我認爲這是私人的原因,但我現在還不完全確定。有一件事我想過做指的是物體的CMessage如下:

this->myCMessage; 

,而不是隻:

myCMessage; 

請問這有什麼區別?

+0

不是。更可能的是您正在調用某個不是線程安全的函數。 – stark

回答

0

好類的私人標籤只是一個語法糖,它不會改變如何生成代碼。

如果你調用一個成員函數和類成員進入空權後,該問題可能是成員函數以某種方式刪除的CMessage對象。請注意,如果CMessage對象分配在堆棧中,則問題可能不是這種情況。

另一個問題可能是,內部CService對象被銷燬(線程被終止),它完成當前功能訪問的CMessage對象之前。

+0

是的,事實證明這個函數之外還有另外一個線程與指針間接混淆了。指針所保存的地址被其他地方存儲到一個向量中,其中的內容被定期清除。 感謝您的幫助:) – Lordmonkey