2012-04-16 61 views
7

我已經在我的軟件C++ &的Java已經一直在努力(建立與Microsoft Visual Studio 2008 &的Eclipse),我一直在努力將其從32位系統移動到64位系統。C++在微軟的Visual Studio錯誤:「Windows已經引發了javaw.exe的斷點」

編譯階段是好的,但在執行我得到一個錯誤,指出:

「Windows已經引發了javaw.exe的斷點這可能是由於 腐敗堆,這表明javaw.exe中的一個錯誤,或者它加載的DLL中的任何一個錯誤 這可能是由於用戶按下了F12而javaw.exe有焦點 輸出窗口可能有更多的診斷信息 [BREAK] [CONTINUE ] [IGNORE]「

你可以在這裏看到錯誤的快照:

enter image description here

有你的這個錯誤是什麼意思什麼想法? 「堆的腐敗」是什麼意思? 你以前有過這種錯誤嗎?

非常感謝!

+0

這種異常也可以通過簡單地分配N個數據槽(任何類型)和實際使用M> N個槽來實現。一切都在編譯,但運行時會產生錯誤。 Avner – user2715960 2014-04-21 14:56:49

回答

5

這不幸通常意味着內存損壞。一些內存雙重釋放,應該返回但不包含任何其他類型的未定義行爲的函數。

解決這個問題的最佳方法就是使用內存分析工具,除非您知道這個錯誤的位置。

+1

他也可以用應用程序驗證程序 – 2012-04-16 10:40:56

0

通常,當您嘗試訪問未分配的內存時會出現這種錯誤。檢查所有的分配(以及釋放),特別是指針指針,以及可以訪問分配給內存的代碼。在你的情況下,poiners的大小是32位的64位,這應該是主要原因。

+1

試試他的運氣我認爲訪問你不擁有的內存會導致運行時出現訪問衝突異常。 – 2012-04-16 10:42:21

+0

進程很可能擁有內存作爲堆的未分配部分,我想這就是他的意思。 – 2012-04-16 10:46:40

12

這是自Windows Vista以來的Windows堆分配器的一個非常好的功能。它告訴你,你的代碼有一個指針錯誤。那麼,希望這是你的代碼,而不是有錯誤的JVM :)你最好假定它是你的代碼。

實際原因的範圍介於溫和之間,例如嘗試釋放已經從另一堆中釋放或分配的內存(當您與另一個程序互操作時並不少見),以徹底討厭,就像早先將堆溢出堆分配緩衝區。

診斷不夠細緻,不足以告訴你究竟出了什麼問題,只是說有什麼問題。您通常會仔細查看代碼並人爲地禁用代碼塊,直到錯誤消失。這就是顯式內存管理的樂趣。如果32位版本是乾淨的(檢查它),那麼由於對指針大小的假設,這可以與64位代碼相關聯。一個64位指針不適合int或long,所以它會被截斷。並使用截斷的指針值將觸發此斷言。這是一個令人高興的問題,您會在Call Stack窗口中找到問題代碼。

4

我明白了! 感謝你的一切,我的理解是記憶的問題,也許的malloc() 其實,我讀here

的水桶大小因子必須是8對32位的倍數爲保證從malloc子系統函數返回的地址 針對所有數據類型正確對齊,64位實現爲16的倍數。

IBM.com

所以,我的問題點改變的malloc()的大小。我去的:

(INT **)malloc的(常量*的sizeof(int)的)

到:

(INT **)malloc的(常量*的sizeof(的int64_t ))

現在它的工作原理!

非常感謝!

+7

你的結構都不正確。調用malloc的一般形式是'(T *)malloc(count * sizeof(T))'。在你的具體情況下,正確的形式是'(int **)malloc(count * sizeof(int *))''。 – 2012-04-19 13:24:11

相關問題