2012-05-11 45 views
0

我的代碼如下執行名爲.str()c_str()操作轉儲

std::ostringstream tmpstr, tmpstr2; 
for(/* something */) 
{ 
    //writting inside tmpstr 
} 

tmpstr2 << tmpstr.rdbuf(); 
cout << "assigned to tmpstr2"; 
out <<tmpstr2.str().c_str() ; // Where out is ostrstream& out 

這是轉儲最後一疊電話: -

std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char> >::~basic_ostringstream

這最後一行時執行給我一個核心轉儲。我無法理解它背後的原因。如果我正在執行的操作是invalid,但是不是彙編錯誤,有人可以告訴我嗎?

+3

可能問題出在您未顯示的代碼中。 –

+2

'.c_str()'在任何情況下都不是必需的。 – Jon

+3

它不應該很難創建一個最小的可編譯的測試用例,爲其他人體驗相同的行爲... – PlasmaHH

回答

1

你用另一條語句破壞了你的記憶。沒有看到實際的代碼很難猜測,但最好的猜測是你在tmpstr或堆棧數組之前分配的東西寫出來之後。

無論哪種方式,實際上應該屬於流對象的內存都會被覆蓋,導致流對象中斷。核心轉儲發生在實際的虛線之後,因爲它沒有被檢測到。你寫了一些界限,但最終在程序的內存中,而不是外部。特別是在tmpstr的記憶中。

+0

can a在tmpstr.str()後面的tmpstr執行'rdbuf'操作,c_str()'是合法的。 – Invictus

+0

是的,這是合法的。我認爲在一些與「tmpstr」無關的代碼中必須有一個錯誤 –