1

以下に、C++/MFC の関数について説明します。

CString StringFunc()
{
    std::string abc = "Hello";

    return abc.c_str();

}

int main()
{
    CString Temp = StringFunc();

    Use_Temp(Temp);
}

1.) StringFunc() によって返された abc.c_str() ポインターの有効期間はどうなりますか? StringFunc() が返された後、変数 'Temp' に安全にコピーされますか?

2.) CString Temp = StringFunc() は浅いコピー操作または深いコピーですか?

4

4 に答える 4

4

StringFunc() によって返された abc.c_str() ポインターの有効期間はどうなりますか? StringFunc() が返された後、変数 'Temp' に安全にコピーされますか?

abcStringFunc() function返却するまで有効です。はい、コピーを CString に返すことは安全です。

ポインターを返すとstd::string::c_str()危険です。たとえば、次のようになります。

const char* EvilFunc()  // bad, dont' do it
{
   std::string abc = "Hello";
   return abc.c_str();
}

const char* p = EvilFunc(); // p becomes wild pointer when EvilFunc returns

CString Temp = StringFunc() は浅いコピー操作または深いコピーですか?

ディープコピーです。CStringから新しいオブジェクトを構築しますconst char*

于 2013-10-08T09:52:22.520 に答える
2

Ad.1) - char ポインターを返すのではなく、CStringそのポインターから暗黙的に構築された のインスタンスを返します。CString渡された文字データのコピーを取ります。

Ad.2) - をコピーまたは割り当てるとCString、ディープ コピーが作成されます。

于 2013-10-08T09:52:30.917 に答える
0

1.):文字列変数は関数の最後で破棄されるため、char const *返されるの有効期間はc_str()、制御フローが関数内にある間だけです。ただし、CString を値で返すため、テンポラリが の結果から暗黙的に構築され、その CString が返されます。この一時的な戻り値は、関数呼び出しが表示される式の最後まで有効です (つまり、関数の結果を temp に代入するステートメント全体)。したがって、あなたの結果はの変数に安全にコピーされます。StringFuncabcc_str()StringFuncStringFuncTempmain

2.) これは「深い」コピーです。そこに新しいオブジェクトを作成します。値で返すため、ほとんどの場合、コンパイラは実際には何もコピーせず (「戻り値の最適化」を参照)、代わりに 1 つのオブジェクトを単純に構築します。

于 2013-10-08T09:53:01.623 に答える
0

はい、メモリはCstring関数から返されたオブジェクトに安全にコピーされます。ディープコピーです。ドキュメントでさえそう言っています:

コンストラクターは入力データを新しく割り当てられたストレージにコピーするため、メモリ例外が発生する可能性があることに注意してください。

于 2013-10-08T09:51:34.060 に答える