2011-03-15 98 views
1

編輯:第一評論者報告說代碼沒有明顯錯誤,所以我用更多的代碼修改了帖子。道歉的長度。再次,當我引用子結構中的字符串變量時,錯誤似乎是......請注意,如果由於寫入另一個字符串變量var,而導致segfaults中的段錯誤發生,將導致第一次寫入。請注意,在這種情況下,子結構中的其他元素(例如double Volume)可以正確寫入,而不會出現運行時錯誤。段結構陣列內部結構的段錯誤問題

編輯2: 根據戴夫的建議,我運行Valgrind的調試啓用可執行文件。它吐出的是:

編輯3: 顯然我有一個版本,而不是在初始化程序中的直接數組的malloc版本。刪除這個問題解決了這個問題。因爲valgrind正在幫助我修復各種其他memleaks /問題,所以我會給Dave充分的信任。謝謝你的幫助,雖然....

36號線是它失敗的一個(以下注釋)

--code刪除,以防止傳播

我宣佈的一個實例我頂層struct(sim_t)在main中。當我嘗試寫入子結構內的字符串時,該程序就會發生段錯誤。寫入子結構的其他變量,例如當我在GDB中運行程序時,似乎正確執行了雙打,整數等。

似乎有什麼明顯的我在這裏失蹤。有沒有人看到這個代碼的問題?

(並記錄在案,請不要對資本的意見,我在下面的MSDN的命名約定標準。)

+2

你發佈的內容沒有任何問題。更多代碼。 – Erik 2011-03-15 14:46:57

+0

您能否提供實際上失敗的代碼... – steabert 2011-03-15 14:49:55

+1

只是猜測 - 您是否在沒有向字符串提供某些內容的情況下將字符串'InitialConfigPDB [1] ='x''編入索引? – 2011-03-15 14:51:52

回答

2

您正在將每個迭代的「boxX_start.pdb」添加到stringstream而不清除流。內存使用情況可能會以很大的NUMBEROFBOXES值快速加起來。試試這個

void InitSimpleVars(sim_t & MySim) 
{ 
    std::stringstream in; 

    MySim.StartTime = clock(); 

    //INITIALIZE Box Sim Vars...                     
    for (unsigned int BoxNumber = 0; BoxNumber < NUMBEROFBOXES; BoxNumber++) 
    { 
     in.str("");                       
     in << "box" << BoxNumber << "_start.pdb"; 
     MySim.Box[BoxNumber].InitialConfigPDB = in.str(); //SEGFAULT HERE, according to GDB      
    } 
} 

在in.str(「」);清除流。清除它可能有更好的方法,但如果有的話我不知道。

+0

或者,只需在for循環中聲明'in',以便構建新實例並且銷燬每一個迭代 – 2011-03-15 17:29:05

+0

這是一個很好的建議,但這不是問題,當我通過GDB運行修改後的代碼時,它仍然存在段錯誤,並且檢查上面的更新,NUMBEROFBOXES很小 - 2。改進!:) – 2011-03-15 17:42:52

2

我猜你溢出堆棧。如果NUMBEROFBOXESsizeof(box_t)都有些大,那麼sizeof(sim_t)將會非常大,然後即使是單個的sim_t實例也會使您的堆棧溢出。

如果無法以任何方式減少sizeof(sim_t),則需要在堆上(例如,使用new)或靜態存儲(例如作爲全局變量)分配對象。


編輯

我仍懷疑存在棧溢出,但它仍然很難在這一點上說。在GDB下運行你的程序並運行這些命令並告訴我們結果如下:

$ gdb myprogram 
(gdb) run 
... 
Program received signal SIGSEGV, Segmentation fault. 
(gdb) bt 
... 
(gdb) list 
... 
(gdb) disas 
... 
(gdb) info reg 
... 
(gdb) info inferior 
... 

最後一個命令給出了程序的PID。然後,從另一個終端,運行這個命令:

# Replace PID here with the PID of the program being debugged above 
$ cat /proc/PID/maps 

從這些命令中的信息應有助於確定是否問題是由堆棧溢出造成的。

+0

嗯我會測試這個... – 2011-03-15 15:15:54

+0

哦,我應該補充說,我有一個以前的版本程序中的所有這些變量都會在主函數中丟失,並且不會溢出堆棧。能否以某種方式將它們放入結構導致堆棧溢出? – 2011-03-15 15:19:27

+0

2 :)沒有意識到被切斷了... – 2011-03-15 16:36:04

2

如果你用-Wall編譯這個,你可能會收到有關包裝更改的警告嗎?標準庫頭之前,由於#pragma pack,我有類似的崩潰。

或者,在更多地查看代碼後,可能會將您的BOX1BOX2定義爲0和1,而不是1和2--因爲您的陣列只有2個方框。

+0

+1爲BOX1和BOX2定義。根據你的問題,這似乎不是問題,但如果程序使它存在,那將是一個問題。 – DavidMFrey 2011-03-15 18:20:52

+0

我使用了'-Wall',並在我的程序的其他地方發現了一些其他問題,我修復了這些問題。正如你所建議的那樣,我也將常量改爲「0」和「1」。雖然以前的#s可能會在代碼的其他地方在執行後引起問題,但這並沒有解決有關這些字符串的崩潰問題......所以,對於好的建議+1,但是這個謎尚未解決! – 2011-03-15 18:50:17

+0

@Jason:你可以發佈一個可重現的測試用例嗎?隨着包括和主要等?我不認爲錯誤是在發佈的代碼中,並且我可以繼續猜測(完成一次make clean?其他地方的堆棧溢出?不一致的自定義操作符new?編譯期間不一致的定義/標誌?恰好會損壞字符串實例的堆溢出? )但這只是猜測... – Erik 2011-03-15 18:56:03