5

コードセグメント1:

wchar_t *aString() 
{
     wchar_t *str = new wchar[5];
     wcscpy(str, "asdf\0");
     return str;
}
wchar_t *value1 = aString();

コードセグメント2

wstring wstr = L"a value";
wchar_t *value = wstr.c_str();

コードセグメント2の値が削除されない場合、メモリリークは発生しません。ただし、コードセグメント1のvalue1が削除されていない場合は、メモリリークが発生します。wstring::c_strの内部コードは私には同じように見えます。

4

4 に答える 4

11

重要なルール:deleteによって作成されたものはすべて使用する必要newがあり、他のものは削除しないでください。

wstr.c_str()オブジェクトによって管理されているバッファへのポインタを返しwstringます。文字列が破棄されると割り当てが解除され、その後、ポインタは無効になります。これを使用deleteするのは間違っています。文字列を変更すると、ポインタも無効になります。

aString()を使用して作成されたバッファへのポインタを返すため、new[]終了したら削除する必要があります(delete[]一致させるには、を使用new[])。これはエラーが発生しやすいため、生のポインターを渡して正しく処理されることを期待するよりも、リソース管理クラス(、、コンテナー、スマートポインターなど)stringを使用する方が適切です。wstring

于 2010-08-06T15:04:32.520 に答える
2

c_str()は、の内部表現へのポインタを返すためですwstring。クラスは、含まれるデータの制御を維持します。

于 2010-08-06T15:03:31.233 に答える
2

basic_string::c_str() MSDNのドキュメントから引用:

返されたCスタイルの文字列は、文字列へのポインタを無効にしたり、削除したりする可能性があるため、変更しないでください。文字列の有効期間は限られており、クラス文字列によって所有されます

于 2010-08-06T15:05:57.907 に答える
1

手足に出て、wstringはwchar_tではなく、代わりにwchar_t *を返す演算子を持つクラスであると言います。したがって、wstringのデストラクタでは、wchar_tの独自のコピーが解放される可能性があります。 *戻ります。

于 2010-08-06T14:58:05.700 に答える