2011-09-17 93 views
1

我有一個名爲Sample的類,其中包含參數value,它的類型爲std::string。 有一個公共成員函數setValue(std::string tempdata)用來設置這個成員的值。std :: string賦值時的分段錯誤

void Sample::setValue(std::string tempdata) { this->value= tempdata; } 

從應用程序我必須設置此參數的值。 我做這樣的事情:

std::string tempvalue = "Hello"; 
Sample s; 
s.setValue(tempvalue); 

當我運行該應用程序崩潰,並通過gdb調試它,我得到:

#0 0x049da761 in __gnu_cxx::__exchange_and_add() from /usr/lib/libstdc++.so.6 
#1 0x049c0e6e in std::string::assign() from /usr/lib/libstdc++.so.6 
#2 0x049c0ed1 in std::string::operator=() from /usr/lib/libstdc++.so.6 
#3 0x08075e9b in Sample::setValue (this=0x83779a8, tempdata=Cannot access memory at address 0xffffffff) 

任何人都可以請建議我應該如何去調試這個問題?

+1

代碼看起來沒問題。您是否修改了頭文件而不重新編譯包含它的文件? (例如,如果您正在使用Makefile並定義這些目標,請執行make clean然後執行make) –

+1

這看起來像是gcc的內部問題,請參閱http://stackoverflow.com/questions/ 7038124/weird-sigsegv-segmentation-fault-in-stdstringassign-method-from-libstdc。 –

回答

2

您顯示的代碼是正確的。所以錯誤在其他地方。例如,它可能會在某些早期階段出現堆棧或堆損壞,直到這些代碼行被執行時纔會被注意到。

+2

值得注意的是'tempdata'在堆棧跟蹤中是'0xffffffff'。這是非常不尋常的,至少對於上面粘貼的代碼。 –

+0

此代碼是我嘗試運行的更大應用程序的一部分。只是當我嘗試爲類成員賦值時代碼崩潰。我同意這可能是堆或堆棧損壞,但如何在如此大的應用程序中查找它並確定0xffffffff是否表明有重要意義? - Amit – Amit

+1

嗯,它表示有人在某個時候寫了'0xffffffff'值給這部分內存。 ;)我認爲@克里斯的觀點是,這不是一個常見的價值。您通常會看到一次*有效的指針值(指向已經釋放的內存塊),或者在調試版本中,您可能會看到特殊值,例如0xcdcdcdcd或0xdeadbeef或其他可識別的未初始化模式或釋放內存。 「0xffffffff」僅僅是重要的,它不是指向數據或代碼的指針。所以有人在你的'tempdata'指針上寫了一些非指針數據。 – jalf

相關問題