簡體   English   中英

是什么導致C ++ STL列表節點內存分配出現段錯誤?

[英]What causes a segfault in C++ STL list node memory allocation?

我已經編寫了一些可以在筆記本電腦上完美運行的C ++代碼(在Microsoft編譯器和MinGW下使用g ++編譯)。 我正在將其移植到Unix機器上。

我已經在Unix機器上同時使用g ++和Intel的ipcp進行了編譯,在這兩種情況下,我的程序在運行一段時間后都會崩潰(出現段錯誤)。 我可以在短時間內運行它而不會崩潰。

調試時,我發現崩潰是在程序嘗試復制STL列表時發生的-具體地說,當程序嘗試分配內存以在列表中創建新節點時發生崩潰。 我在調試器(TotalView)中遇到的錯誤是“分配調用失敗或返回的地址為null”。

崩潰並非總是在每次運行時都在代碼的同一位置發生,而是總是在分配調用期間發生,以在STL列表中創建節點。 我不認為我的內存不足。 我有一些內存泄漏,但是它們很小。 還有什么會導致內存分配錯誤? 為什么會在Unix機器上而不是在我的PC上發生呢?

更新:我使用MemoryScape來幫助調試。 當我使用防護塊時,程序運行時沒有崩潰,這進一步提示存在內存問題。 最終解決該問題的方法是“繪制”分配的內存。 事實證明,我正在初始化變量,但在將其用作數組索引之前未將其設置為值。 因此,該數組處於超載狀態,因為它使用了變量內存位置中的任何垃圾-通常為0或其他一些小數,所以沒有問題。 但是,當我運行程序足夠長的時間時,當我寫出數組的邊界時,它更有可能持有更大的數目並破壞堆。 用較大的數字繪制分配的內存會在我試圖在數組中寫入值的代碼行處發生段錯誤,並且我可以看到該較大的繪制數字被用作數組索引。

這很可能是由堆損壞引起的-在代碼的其他地方,您正在覆蓋釋放的內存,或者在超出內存分配范圍的情況下寫入內存(緩沖區溢出,或者在分配的內存開始之前寫入)。 堆損壞通常會在不相關的位置(例如STL代碼)中導致崩潰。 由於您使用的是Unix平台,因此應嘗試在valgrind下運行程序以嘗試識別原始堆損壞。

這聽起來像是動態內存分配數據結構的損壞,通常是由其他不相關的代碼引起的。 這種臭名昭著的臭名昭著的是,如果沒有外部工具就很難找到和重現它,因為內存布局的任何更改都可能掩蓋它。 在Windows版本中,可能運氣不錯。

內存調試器是捕獲此類損壞的好工具。 valgrinddmallocefence是檢查程序正確性的很好選擇。

 I have a few memory leaks, but they're very small.

好吧,如果您將其運行一段時間,則最終會占用大量內存。 這就是關於泄漏的事情。 您應該在崩潰時記錄內存使用情況,以查看是否有可用的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM