嗨,
我仍然在學習先進的C++編程。我在C++代碼中遇到分段錯誤。在使用gdb時,失敗點是在解除分配器(malloc)參數之一的情況下被優化的值(av = value optimized)。我的問題是,這個條件(值優化)是否導致解除分配器中的分段錯誤?我之所以問這個問題是因爲我能夠打印這些值,但gdb由於某種原因無法讀取它們。
謝謝。
嗨,
我仍然在學習先進的C++編程。我在C++代碼中遇到分段錯誤。在使用gdb時,失敗點是在解除分配器(malloc)參數之一的情況下被優化的值(av = value optimized)。我的問題是,這個條件(值優化)是否導致解除分配器中的分段錯誤?我之所以問這個問題是因爲我能夠打印這些值,但gdb由於某種原因無法讀取它們。
謝謝。
不,優化值只是表示優化器通過寄存器傳遞參數,這意味着gdb無法看到它的值。如果你用-O0編譯,你會在gdb中看到這個值。
錯誤可能是您的錯誤。例如。釋放已被釋放的地址,或釋放從未分配的地址。
附註:對於C++,建議使用new
,delete
,new[]
和delete[]
。
您需要提供更多的上下文。
通常是正確的,但是當某些東西被「優化出來」時,並不總是意味着它通過了寄存器。有時候,價值已經被分解到某個特定價值在任何實際意義上都不存在的地步。 – 2010-07-08 16:38:01
@Evan謝謝...我第一次在gdb中注意到這個條件(值優化出來),尤其是每個seg錯誤..我只是想了解它是我的還是環境......看起來像是我的: - ) – user380644 2010-07-09 01:02:16
謝謝...我第一次在gdb中注意到這個條件(值優化了),尤其是每個seg故障..我只是想了解它是我的還是它的環境..看起來像它的我:-) – user380644 2010-07-09 01:02:45
優化後的值不能引入段錯誤。這意味着malloc
的參數在調用後沒有使用,所以不是將它存儲在調用者的堆棧幀中,而是使用寄存器直接傳遞給malloc
,所以gdb無法顯示內存地址(它不存儲在內存)
我不太明白你的問題......也許代碼片段可以幫助...我推薦使用新/刪除操作符而不是malloc/realloc/free,因爲你正在學習C++ – YuppieNetworking 2010-07-08 16:26:34
如果你正在嘗試建議有一個編譯器錯誤,你會得到一個非常懷疑的迴應,沒有更多的解釋和很多代碼。 – 2010-07-08 17:04:36