2011-12-13 35 views
0

我已爲光線跟蹤應用程序實現了專門的樹數據結構。我在每個樹的節點中使用std :: list來存儲數據項。我在運行應用程序時出現問題,使用此數據結構時,不僅會崩潰應用程序,還會凍結整個操作系統(Windows 7)。這僅在發佈模式下發生;在調試模式下需要更長的時間(如預期的那樣),但工作正常。我正在使用Visual Studio 2010.在發佈模式下運行(Ctrl + F5)或調試(F5)都會導致整個系統崩潰。C++完全系統崩潰,僅限發佈模式

從我迄今爲止發現的情況來看,釋放模式和調試模式之間的不同行爲似乎歸因於內存泄漏,因爲調試模式(從我所瞭解的內容來看)有點寬容。但是,我沒有發現任何關於C++應用程序崩潰的操作系統。

我只想知道在什麼情況下會發生這種行爲,所以我知道在哪裏看。將問題簡化爲簡單並追蹤問題是困難的,因爲它具有高度並行性和處理大量數據的光線追蹤性質。

哦,問題是不是一個無限遞歸導致堆棧溢出。我故意實現了這一點,並沒有使操作系統崩潰。

+3

很大的功能從用戶空間代碼凍結Windows 7。你說這是大規模並行和大量的數據,可能是因爲你耗盡了資源,並且使整個系統瀕臨停滯。我有應用程序通過運行所有可用的RAM和交換來關閉Linux機器,成爲一個3分鐘的任務切換到終端,並嘗試殺死應用程序。 –

+0

如果您的代碼是可移植的,請嘗試在更穩定的操作系統上進行編譯,並找出錯誤的原因。通過崩潰操作系統進行調試需要很長時間。 – thiton

+0

如果您使用調試信息構建發行版本,它會正常工作嗎?否則,它可能會幫助您縮小發生碰撞事故的地點。 –

回答

2

您是否在調試模式下檢查了內存使用情況?過度的內存使用和溢出會降低系統的速度 - 地獄 - 你的系統可能沒有技術上的崩潰 - 只是變得非常慢。在發佈模式下,所有的分配將以相當快的速度發生 - 因此您可能需要查看內存使用情況。

正如你所說,無限遞歸不會導致他的操作系統崩潰 - 它總是導致分段錯誤。

+2

是的,這正是我想要得到的,應用程序可以快速地分配內存和CPU,調度程序甚至不會看到它來,一旦你點擊swap/pagefile,它基本上是遊戲結束。 –

+0

我剛剛在調試和發佈模式中進行了檢查。在調試模式下,內存的增加非常少,並且有足夠的空間。在釋放模式下,它會啓動並且系統凍結。所以,是的,你們對撞車的原因都是正確的。但是爲什麼我在Debug模式下看不到相同的內存浪涌? – Gigi

+0

對不起,不能給你一個確信的答覆..但它可能與C++運行時庫如何在發佈模式下處理動態內存分配和釋放有關。搜索這些行可能會有所幫助。 – shekhar