ホームページ >バックエンド開発 >C++ >`stringstream.str().c_str()` を `const char*` に代入するとダングリング ポインタが発生するのはなぜですか?この問題はどのように解決できますか?

`stringstream.str().c_str()` を `const char*` に代入するとダングリング ポインタが発生するのはなぜですか?この問題はどのように解決できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-22 07:17:14225ブラウズ

Why does assigning `stringstream.str().c_str()` to a `const char*` lead to a dangling pointer, and how can this issue be resolved?

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&amp; tmp = stringstream.str();   
  const char* cstr = tmp.c_str();
}

変更されたコード例では、両方の cstr cstr2 は、const string オブジェクトの存続期間中存在する有効な C スタイルの文字列を指します。結果として、両方の文字列を正しく出力できます。

不必要なコピーを回避し、より効率的で簡潔な解決策を可能にするため、一時文字列を const 参照にバインドすることが一般的に推奨されることに注意することが重要です。

以上が`stringstream.str().c_str()` を `const char*` に代入するとダングリング ポインタが発生するのはなぜですか?この問題はどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。