Stringstream、String、char* 変換について理解する
プログラミングにおけるよくある混乱の 1 つは、stringstream、string、char 間の相互作用に関係しています 変換。この記事は、stringstream.str().c_str() から返された文字列がメモリ内のどこに存在するのか、またそれを const char.
に直接割り当てることができない理由を明確にすることを目的としています。stringstream を使用する場合、str( ) 関数は、呼び出された式内にのみ存在する一時文字列オブジェクトを返します。通常、この文字列オブジェクトはスタック上に作成され、式が終了すると破棄されます。
提供されたコード例を調べてみましょう:
#include <string> #include <sstream> #include <iostream> using namespace std; 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 に変換します。返された文字列は一時的なものであるため、式の終了後に破棄され、ダングリング ポインターを指す cstr2 がレンダリングされます。その結果、cstr2 を出力するとガベージが発生します。
問題の解決:
この問題を回避するには、一時的な文字列を永続的な文字列オブジェクトにコピーして、その文字列を取得します。 C スタイルの文字列、または一時文字列を const 参照にバインドして、有効期間を延長します:
// Copy to a permanent string const std::string tmp = stringstream.str(); const char* cstr = tmp.c_str(); // Bind to a const reference { const std::string& tmp = stringstream.str(); const char* cstr = tmp.c_str(); }
変更されたコード例では、両方の cstr cstr2 は、const string オブジェクトの存続期間中存在する有効な C スタイルの文字列を指します。結果として、両方の文字列を正しく出力できます。
不必要なコピーを回避し、より効率的で簡潔な解決策を可能にするため、一時文字列を const 参照にバインドすることが一般的に推奨されることに注意することが重要です。
以上が`stringstream.str().c_str()` を `const char*` に代入するとダングリング ポインタが発生するのはなぜですか?この問題はどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。