ホームページ > バックエンド開発 > C++ > C で `stringstream.str().c_str()` がメモリ エラーを引き起こすのはなぜですか?

C で `stringstream.str().c_str()` がメモリ エラーを引き起こすのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-15 05:01:02
オリジナル
1058 人が閲覧しました

Why Does `stringstream.str().c_str()` Cause a Memory Error in C  ?

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 ステートメントが正しく動作するようになりました。

  • cstr およびcstr2 どちらも有効な文字列ポインタです。
  • ss.str().c_str() は、const 参照にバインドされ、その有効期間を延長する一時文字列です。

以上がC で `stringstream.str().c_str()` がメモリ エラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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