2013-05-06 62 views
0

我在我的C++項目中有一個討厭的錯誤。還有一類如何在特定對象的特定方法中設置斷點?

class SomeClass { 
    ... 
    std::string *someString; 
    ... 
} 

這裏是一個構造函數

SomeClass(...) { 
    ... 
    someString = new std::string(""); 
    ... 
} 

而且事情是,事後我只與特定的字符串操作,而無需修改poiner值。我分配給該字符串不同的字符串的時候,像

*someString = "whatever"; 
someString->assign("whatever"); 
*someString += 'a'; 

多線程應用程序,有一個得了很嚴重的故障。在某個時候,應用程序崩潰。調試器顯示變量some​​String具有A BAD POINTER。我不知道這是如何可能的

delete someString; 

從來沒有呼籲。

我看了該字符串的指針所有引用和這裏就是我可以告訴你:

  1. 刪除該指針永遠不會被調用。
  2. 指針永遠不會被分配給其他任何東西(它可能在以後被刪除)。
  3. 該字符串的指針值不會以任何方式改變(調試器顯示'Bad Ptr')。
  4. 其他類變量看起來像他們應該是。

因此,我需要找到一種方法來檢查何時在特定對象上調用析構函數。事實上,對象的數組。

那麼,有沒有一種方法來設置一個特定的對象集上的析構函數(或任何其他方法)的斷點?(我正在處理visual studio 2010 proffessional)?

+0

你知道有條件的斷點嗎? – hansmaad 2013-05-06 11:05:02

+2

爲什麼你需要一個指向std :: string的指針......這有危險。 – fritzone 2013-05-06 11:10:27

+1

在賦值/複製構造函數上放置斷點並查看這些操作的輸出是否正確。 – shivakumar 2013-05-06 11:12:26

回答

1

如果您是多線程,請考慮爲您的字符串成員實施鎖定機制...(如果您沒有這樣做)。高度可能的一個線程試圖寫入一個正在重新分配在另一個線程中的指針......或類似的東西。多一點的代碼可以幫助我們在更深的背景下理解問題。

+0

很好的答案,會試試看。沒有想到,互斥可能會解決我的問題。 – 2013-05-06 11:18:05

+0

我試圖鎖定每個訪問與互斥體的指針。另外,我試圖檢查指針值是否在創建後立即被修改。現在我確定調用了std :: string的某個地方的析構函數。儘管如此,我無法想象在哪裏...... – 2013-05-06 16:56:38

相關問題