[解決済み] std::string::c_str() の結果のライフタイムはどのくらいですか?
2022-11-20 18:40:17
質問
私のプログラムの中で、あるレガシーコードとインターフェイスする必要があります。
const char*
.
のような構造を持っているとします。
struct Foo
{
const char* server;
const char* name;
};
私の上位のアプリケーションでは
std::string
を使うことを考えました。
std::string::c_str()
を使って
const char*
のポインタを返します。
しかし、その寿命は
c_str()
?
未定義の動作に直面することなく、このようなことを行うことは可能ですか?
{
std::string server = "my_server";
std::string name = "my_name";
Foo foo;
foo.server = server.c_str();
foo.name = name.c_str();
// We use foo
use_foo(foo);
// Foo is about to be destroyed, before name and server
}
の結果をすぐにコピーすればいいのでしょうか?
c_str()
の結果を別の場所にコピーすればよいのでしょうか?
ありがとうございます。
どのように解決するのですか?
この
c_str()
の結果は、もし
std::string
が破壊されたり、文字列の非恒等式メンバ関数が呼ばれたりすると 無効になります。 そのため、通常は、それを残しておく必要がある場合は、そのコピーを作成することになります。
あなたの例の場合、どうやら結果は
c_str()
の結果は、そのスコープにいる間は文字列が変更されないので、安全に使用されるようです。 (しかし、私たちは
use_foo()
または
~Foo()
がこれらの値に対して行っているかもしれません。もし、文字列を別の場所にコピーするのであれば、真の
コピー
を行うべきで、単に
char
のポインターをコピーするのではありません)。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較