9

char* を返す関数があります。いくつかの文字列を連結する必要があるため、次の行を書きました。

std::string other_text;
// ...
func(("text" + other_text).c_str());

使用したい文字列に名前を付けるという質問を避けることができることを知っています。より一般的な質問をする機会を得たいだけです: 一時変数のメソッドを呼び出すのは安全ですか? 規格に準拠していますか?

4

4 に答える 4

14

一時変数のメソッドを呼び出すことは安全ですが、後で使用するために一時変数の char* を返すことは安全ではありません。

この char* は、すぐに解放されるバッファーを指します。解放されると、メモリ内の無効な領域へのポインターが作成されます。

代わりに std::string オブジェクトを返してください。

于 2009-03-31T14:45:49.273 に答える
6

一時的にメソッドを呼び出すことはできますが、オブジェクトの有効期間について注意する必要があります。特に、c_str()一時的に呼び出される関数がある場合std::string、その文字列オブジェクトは関数が戻るときに破棄されます。

上記のコードはこの問題に悩まされています。

于 2009-03-31T14:48:05.337 に答える
4

一時的に c_str() を呼び出すことによって返される C 文字列は、一時的に c_str() を次に呼び出すまで有効です。一時自体は、それが含まれる完全な式 (return ステートメント) の最後までぶら下がっています。

std::string を返す場合、文字列のコピー コンストラクターが戻り値で呼び出されてコピーが取得されるため、すべてが複雑になります。char * を返すと、返される値は関数の終了時に破棄されるため、すべての賭けはオフになります。これは特に一時的なものとは関係ありません。char * を返すときの一般的な問題です。代わりに std::strings を返すことをお勧めします。

于 2009-03-31T14:51:55.470 に答える
2

生成されたポインターは、一時的なものがまだ残っている限り、通常は式の終わりまで有効です。例外は、イニシャライザでテンポラリが使用される場合 (この場合、初期化が終了するまで続く)、または参照にバインドされる場合です。関数 return ステートメントの一時は、関数が終了するまで続きます (参照にバインドされていない限り)。一時的な有効期間が終了すると、一時的なものは破棄されます。この場合、文字列デストラクタが実行され、文字のメモリが解放されることを意味します。つまり、値が返されると、無効であることが保証されます。

文字列自体を戻して、const 参照として返すことができます。.c_str() を新しく割り当てられたメモリにコピーし、それを (ポインタまたはスマート ポインタとして) 戻すことができます。それらのいずれかが機能します。

一時変数の有効期間は、C++ 標準のセクション 12.2 でカバーされています。標準によれば、解放されたメモリへのポインタを返しています。

于 2009-03-31T15:02:45.693 に答える