2017-05-08 4 views
0

このコードは安全ですか?エラーなしで実行されるため、私は自分のためにトラップを設定しているのではないかと心配しています。返されたstd :: stringにptrを渡す

void targetMethod(const char *arg); 
std::string helperMethod(char *text) { return std::string(text); } 

targetMethod(helperMethod().c_str()); 

helperMethodは()のstd ::文字列を返し、呼び出し元のコードは、その基礎となる、char *を取得し、()targetMethodに渡します。私は返された文字列が一時的であることを心配しているので、その基になるchar *を取ることは危険です。

std::string myTemp = helperMethod("hello"); 
targetMethod(myTemp.c_str()); 
+0

ありがとう、コーディ。私は私の検索を鋭くする必要があります。 – MJF

答えて

2

targetMethodによって異なります。後で使用するためにポインタを格納しておくと、いいえ、安全ではありません。しかし、関数呼び出しの間だけそれを使用すれば、それは安全です。文字列の存続期間は、文字列が作成された完全な式の末尾まで続きます。

2

一時的には、式(セミコロンまで)の終わりまで生きますので、それは安全である:ので、代わりに私はこのような何かを行う必要があります。

私はconst char *からstd :: stringを構築できるので、なぜhelperMethodが必要なのかわかりません。

+0

"それは安全です" - 'targetMethod'がポインタのコピーを保存しない限り。 – lcs

+0

はい。他の答えは、 "ポインタをコピーする"という警告が追加され、正しいものです。 –

+0

helperMethod()は現実世界でより多くのことを行います。この例では、何が起こっているかを示すためだけに見えます。 – MJF

関連する問題