2012-04-19 83 views
0

具有運行使用Microsoft Visual C編譯時++ 2008 Express的上線調試新時被稱爲

comparison_vectors = new vec_element[(rbfnetparams->comparison_vector_length)+1]; 

與MYPROG.EXE在0x7c93426d錯誤未處理的異常崩潰的程序奇怪的錯誤:0000005:訪問衝突閱讀位置00000000

rbfnetparams->comparison_vector_length計算結果爲4(應該做的,並在調試器中檢查),而且當我改變行作爲測試的東西仍然崩潰的位置:

comparison_vectors = new vec_element[5]; 

vec_element是一個有幾個整數,雙打和幾個布爾的結構,但沒有方法或構造函數。如果我用malloc替換new,然後在另一個新的地方崩潰,這個事情就會運行。它每次運行時都不會崩潰,只是有時會出現這種情況,但似乎每次執行相同次數的迭代後都會崩潰。內存使用量在這個程序中只有10MB。

這會變得很陌生,因爲同一個程序在Solaris上編譯和運行在gcc下,通常顯示的錯誤遠遠多於Windows。

任何幫助將不勝感激,因爲我在如何調試這一個損失。

+4

這聽起來像是一個堆腐敗問題給我。你有沒有嘗試在valgrind下運行該程序? – JaredPar 2012-04-19 18:43:49

+4

...或者在VS本身下運行Debug版本,這通常會很快出現堆問題。問題可能不在這條線上,但更早。 – 2012-04-19 18:46:05

+1

如果他在Windows上,這將無法工作 - 不適用於Windows的Valgrind端口。也就是說,如果他的代碼可以在* nix系統上編譯,他可以檢查,但是如果他使用的是Windows約定(如果跨平臺不存在,這很有可能),那麼他將會不幸運。 – RageD 2012-04-19 18:46:32

回答

1

Access violation reading location 0x00000000表示「你取消了一個NULL指針。」它看起來像有一段時間rbfnetparamsNULL當你到達這條線,因此你得到的錯誤。

我無法解釋爲什麼comparison_vectors = new vec_element[5];崩潰。這是相同的錯誤信息?

檢查行之前是否有rbfnetparamsNULL,看它是否被命中(或添加了條件轉折點)。然後確定rbfnetparams是否爲NULL是其他地方的更大錯誤的症狀。

取消引用NULL指針是未定義的。 Solaris編譯器可能會執行一個掩碼錯誤的優化。 That's allowed by the Standard(閱讀從該帖子引用的整個系列)。

+0

事實上,當分配5時出現新的崩潰就證明你正在吠叫錯誤的樹。他有堆腐敗。 – 2012-04-20 09:32:43

+0

@MooingDuck,通常我會同意你的看法。但「訪問衝突讀取位置0x00000000」始終表示「NULL」指針解除引用。「它沒有其他含義。它可能是'NULL'是內存分配例程使用的內部變量,但我懷疑它。我已經看到了足夠的案例,證明「相同的錯誤」不是完全相同的,或者是一個不正確的報告,或者在某種程度上被證明是我決定忽略那部分的紅鯡魚的報告,並提及我忽略它。 – 2012-04-20 14:33:00

+1

@MaxLybbery:我想我並不清楚,他肯定會解引用NULL指針,但NULL指針的_cause_是堆損壞。 NULL指針只是一個巧合的副作用。 – 2012-04-20 18:01:50