stringstream、string、char 間の変換に関する混乱*
この問題は、stringstream.str() から取得した文字列を変換するときに発生します。 c_str() を const char* に変換します。潜在的なエラーを回避するには、返された文字列のメモリ管理と有効期間を理解することが重要です。
コード スニペットは問題を示しています。
#include <string> #include <sstream> #include <iostream> int main() { stringstream ss("this is a string\n"); string str(ss.str()); const char* cstr1 = str.c_str(); const char* cstr2 = ss.str().c_str(); cout << cstr1 // Prints correctly << cstr2; // ERROR, prints out garbage system("PAUSE"); return 0; }
stringstream.str().c_str( ) を const char* に代入できるのは正しくありません。これにより、cstr2 がガベージを出力するというバグが発生します。
メモリ管理について
stringstream.str() は、最後までのみ有効な一時的な文字列オブジェクトを返します。現在の式の。式が完了すると、一時オブジェクトは破棄され、そのデータへのポインタ (c_str() によって返される) が無効になります。
エラーの解決
解決するにはこの問題では、一時文字列オブジェクトを別の変数に保存する必要があります。
const std::string tmp = stringstream.str(); const char* cstr2 = tmp.c_str();
一時オブジェクトを次のように保存します。 tmp、ポインタの有効期間が延長され、cstr2 の出力が正しく動作するようになりました。
ボーナス ポイントの説明
変更されたコード ブロック内:
cout << cstr // Prints correctly << ss.str().c_str() // Prints correctly << cstr2; // Prints correctly (???)
次の理由により、すべての print ステートメントが正しく動作するようになりました。
以上がC で `stringstream.str().c_str()` がメモリ エラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。