2011-04-21 68 views
3

我是一名軟件實習生,在C++中使用大型項目​​,&我也是一個團隊。令人畏懼(這是你如何拼寫:P),是的,但也很有趣。我不知道,但我懷疑它,因爲我指向的對象被更新,因此最初分配指針不指向正確的內存地址。查找指針何時超出範圍的程序和技巧

正如你可以看到我很困惑自己,這就是爲什麼我想知道的技術或免費程序這幫助我確定何時& WHERE指針指向空或超出範圍(懸掛指針?是最新發生的)

也許我可以使用簡單的ASSERT調用來確定指針何時爲空?

更多信息:現在我的問題是,我有一個類的成員變量是指針。它們在構造函數的末尾由構造函數&初始化,這些指針指向正確的對象。但在對事件的反應中,當我看着這些指針時,它們是空的/超出範圍。我可以確定這是因爲1.程序崩潰& 2 eclipse調試器將它們顯示爲紅色空心圓圈(我認爲這意味着指向NULL或超出範圍?)。

+1

我認爲你需要做得比這更好。如果它們變成'NULL',那是因爲有些東西將它們設置爲'NULL'。我沒有看到任何沒有看到你的代碼的人可以說如何。哦,並且無論如何,如果您需要澄清發生的事情,請將'ASSERT'放在所有位置。而且,當你在使用調試器的時候,它也會變得更好。 – 2011-04-21 03:33:54

+0

您提到使用Eclipse;你在Windows上,你有/可以使用Visual Studio嗎?VS2010和2008的某些版本附帶內置的分析功能,可以提供一些幫助。您也可以下載WDK並從中使用PREfast。 – ssube 2011-04-21 03:34:53

+0

更新一個對象不會*使指向它的指針無效。 – fredoverflow 2011-04-21 07:52:27

回答

5

我建議兩種不同的工具:

  • Cppcheck是一個靜態分析工具,看你的源代碼,並試圖發現問題(與指針,並與很多其他事情也是如此)。

  • Valgrind是一個運行時工具,它監視程序執行的所有分配和釋放,並確保它們都是正確的。

+0

@Greg Hewgill感謝您的回覆。我以前看過Valgrind,是程序運行時運行的圖形用戶界面還是c庫?我在自己的代碼中放置了valgrind c函數來檢查指針? – Mack 2011-04-21 03:35:08

+0

Valgrind既不是 - 而是以'。/ myprogram'或其他方式運行你的程序,你運行'valgrind ./myprogram',輸出被寫入控制檯。它的操作幾乎完全是自動的,你根本不需要修改你的代碼。 – 2011-04-21 03:38:54

+0

@伊巴克斯特:這是一個嚴重的錯誤表述。我會留下來的。 – 2011-04-21 03:55:38

1

如果被指向的對象是自定義類,那麼可以在析構函數中放置斷點以查看它是否被銷燬。如果沒有,您可以爲該類的析構函數設置一個符號斷點。

0

使數據(指針)變爲私有,並通過斷言強制使用特定用法。例如:

class t_class { 
public: 
    /* ... */ 
    void invalidatePointer() { 
    /* is a delete required??? */ 
     this->d_pointer = 0; 
    } 

    void setPointer(int* const p) { 
     assert(p && "use invalidatePoiner"); 
     /* ...stuff... */ 
     this->d_pointer = p; 
    } 
private: 
    int* d_pointer; /* you probably don't want a non-contained pointer here, either */ 
}; 
1

您需要一個數據中斷點。 Visual Studio肯定有他們。 GDB肯定有他們 - 它可能稱他們爲別的東西(觀察點?)。我沒有使用Eclipse,但它可能也是。

因此,您在構造函數中設置了一個(常規)斷點,以便指針正確設置。然後選擇其中一個指針,並在其上放置數據中斷點。然後運行。當某些東西改變了指針的值時,程序將停止。這會告訴你問題在哪裏。