`stringstream.str().c_str()` を `const char*` に代入するとガベージ出力が発生するのはなぜですか?

Barbara Streisand
リリース: 2024-11-16 17:16:03
オリジナル
463 人が閲覧しました

Why Does Assigning `stringstream.str().c_str()` to a `const char*` Lead to Garbage Output?

stringstream、string、および char* 変換の混乱

この記事では、stringstream によって返される文字列に const char* を割り当てる問題について説明します。 .str().c_str().

問題説明

stringstream.str() は、式の最後に破棄される一時文字列オブジェクトを構築します。この一時文字列を const char* に割り当てると、ポインタは削除された文字列を参照するため、ガベージ出力が発生します。

次に例を示します。

stringstream ss("this is a string\n");
const char* cstr = ss.str().c_str();
ログイン後にコピー

上記のコードでは、式の後にあります。終了すると、stringstream.str() によって作成された一時文字列が削除され、cstr が無効なメモリを指すようになります。 location.

解決策

この問題を修正するには、一時文字列を const char* に変換する前に別の文字列オブジェクトにコピーする必要があります。これは、次のアプローチを使用して実現できます。

string tmp = stringstream.str();
const char* cstr = tmp.c_str();
ログイン後にコピー

ボーナス ポイントの説明

次の変更されたコードは、文字列を正しく出力します。

cout << cstr << ss.str().c_str() << cstr2;
ログイン後にコピー

この変更は次の理由で機能します:

  • cstr が const を指している有効期間がわかっている文字列オブジェクトから作成された char*。
  • ss.str().c_str() は、一時文字列を指す const char* を返します。この一時文字列は、返された const 参照によって保護されています。 stringstream.str() によって
  • cstr2 は ss.str().c_str() と同じ一時文字列を指しますが、const ではないため、 cout ステートメントの最後で破棄される一時的な char*。

以上が`stringstream.str().c_str()` を `const char*` に代入するとガベージ出力が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート