ホームページ  >  記事  >  バックエンド開発  >  値によって文字列を返す関数で `std::string.c_str()` を呼び出すと問題が発生するのはなぜですか?

値によって文字列を返す関数で `std::string.c_str()` を呼び出すと問題が発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 06:44:29414ブラウズ

Why Does Calling `std::string.c_str()` on a Function Returning a String by Value Lead to Problems?

文字列を返す関数で std::string.c_str() を呼び出すと問題が発生する理由

文字列を扱う場合C 、一時オブジェクトの有効期間を理解することが重要です。よくある誤解は、値によって文字列を返す関数の戻り値に対して std::string.c_str() を呼び出すときに発生します。

次のコード スニペットでは:

<code class="cpp">std::string getString() {
    std::string str("hello");
    return str;
}

int main() {
    const char* cStr = getString().c_str();
    std::cout << cStr << std::endl;
}</code>

One関数 getString() は、関数スコープ内に格納されている文字列 str のコピーを返し、cStr がその文字列への有効な参照を保持できるようにすることを期待するかもしれません。

しかし、これは当てはまりません。 C では、関数呼び出しの戻り値は一時オブジェクトです。一時オブジェクトが参照にバインドされている場合、または名前付きオブジェクトの初期化に使用されている場合、その有効期間は延長されます。それ以外の場合、それが作成された完全な式の最後に破棄されます。

上記のコードでは、getString() の戻り値は std::string 型の一時オブジェクトであり、これが返されます。価値観によって。 cStr は参照にバインドしたり、名前付きオブジェクトを初期化したりしないため、一時的な std::string オブジェクトは式 getString() が評価された後に破棄されます。これは、cStr が割り当て解除されたメモリを指すようになり、安全に使用できないことを意味します。

この問題を回避するには、一時オブジェクトを名前付きオブジェクトにコピーするか、次のような参照にバインドして、一時オブジェクトの存続期間を延長することを検討してください。 :

<code class="cpp">std::string str = getString();
const char* cStr = str.c_str();</code>

または:

<code class="cpp">const std::string&amp; ref = getString();
const char* cStr = ref.c_str();</code>

また、c_str() によって返されたポインタを変数に格納せずにすぐに使用することもできます:

<code class="cpp">std::cout << getString().c_str() << std::endl;</code>

以上が値によって文字列を返す関数で `std::string.c_str()` を呼び出すと問題が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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