2016-07-11 2 views
1

他のどこかのchar文字列があるとしましょう。後でそれは、ワイド文字列を受け入れる関数の入力パラメータとして使用されます。一時的なAnsiStringオブジェクトまたはUnicodeStringオブジェクトを関数のパラメータとして指定するのは常に安全ですか?

バリアント1では、UnicodeStringがchar文字列から作成され、2番目の手順でLoadLibrary()関数へのwchar_t *ポインタとして使用されます。

バリアント2で記述されているように、これを1つのコード行に短縮することは常に安全ですか?特に、一時的なUnicodeStringオブジェクトは、関数自体で使用されている間、十分に長く存続しますか?オブジェクトを早期に破壊するような特別な状況がありますか?

char *libstr = "test.dll"; 
//... 

//Variant 1 
UnicodeString us(libstr); 
HINSTANCE lib = LoadLibrary(us.w_str()); 

//Variant 2 
HINSTANCE lib = LoadLibrary(UnicodeString(libstr).w_str()); 

おかげで、

編集: @デビッドHeffernanのこれはUnicodeStringのための具体的な質問であるためC++ の一時的な引数の答え質問に関するライフスパンを指しているとDelphiでオブジェクトをAnsiStringのため おかげで、 C++ Builderでは、これらのオブジェクトはPascalを使用してVCLにコード化されていますが、私はまだトピックについて疑問を抱いています。トピックに100%関心はありません。ありがとうございました。

+2

AnsiStringとUnicodeStringはC++でクラスとして実装されているため、他のクラスと同じ規則に従っており、同じ生涯規則の影響を受けます。ちなみに、 'w_str()'の代わりに 'c_str()'を使うべきです。 –

+1

多少関連した質問はhttp://stackoverflow.com/q/13474486/3235496(別の状況だが興味深い情報)です。 – manlio

+0

@manlio、本当に面白い情報、ありがとう。 –

答えて

2

私はもともとこの質問の重複としてこれを閉じて:C++: Life span of temporary arguments?

私はクロージャが有効であると考えています。

テンポラリオブジェクトは、それらが作成されたポイントを(字句的に)含む完全表現を評価する最後のステップとして破棄されます。

これは、一時的な呼び出しが関数呼び出しより長く安全であることを意味します。

問題のクラスがC++クラスではないと主張して、クロージャに複製に反対しました。しかしそれは間違った信念です。それらはC++クラスです。そして、C++ルールが適用されます。

+0

私はあなたのポイントを見ます。あなたは私の質問に答えました。再度、感謝します。 –