2014-12-05 22 views
0

我有~15'000行C/C++程序和其中某處 - 簡單數組用於超出邊界(它是我的猜測),原因是未定義的行爲'發生(好吧,不,我的CDROM不是隨機打開的),但堆內存是從代碼中的某處修改的!一些定義的整數內存只是進入了它不應該發生的內存的隨機異常,如果我刪除或改變任何異常發生在其他地方,奇怪和scarry ...所以,我需要用任何東西來替換100個數組什麼會檢查邊界正常。而且任何事情都需要最小的修改。最接近可能的解決方案,用一些可以檢查邊界的東西來替換數組C++

我可以創建一個類模仿數組行爲,但檢查邊界,所以我可以輕鬆地更改所有數組?或者你會提供哪種解決方案?我有點新C++,任何例子對我來說都是黃金。

我使用Windows 7, 說簡單數組我的意思是:

int data[400]; 
data[20] = 4; // its fine 
data[-13] = 9; // opens cdrom, or formats hard drive, or works till your windows gets updated 
+0

你可以拿出你的一些代碼,以便我們看到嗎? – bobtheboy 2014-12-05 00:23:31

+0

['std :: array'](http://en.cppreference.com/w/cpp/container/array) – 2014-12-05 00:24:45

+0

調試確實非常棘手。我建議使用valgrind或等效工具,可以爲您提供有關無效內存訪問的更多信息。 – SirDarius 2014-12-05 00:25:28

回答

0

堆內存的意外修改可能是由於數組邊界違規行爲。

也可能是是由於解引用懸空指針。根據我的經驗,這更可能。

在15000行代碼中,解決這個謎題的最快方法是投入時間來弄清楚如何使用像valgrind這樣的工具。

既然你說你是在C++還挺新的,你應該注意的是,standard library's template containers(如邊界檢查,能std::arrayrange-based for loopssmart pointers炎等,以防止這兩個我提到的問題。

+0

我做了什麼:使用std:array,默認通過[]運算符修改它以檢查邊界,並修改所有數組以初始化我的新數組類。在檢查了所有內容之後,我會禁用默認邊界檢查,或者只檢查cpu優化問題。發現兩個數組超出界限,但主要失敗的原因是使用指針未正確初始化數據。 – Tomas 2014-12-06 13:34:30