wstring::c_str が適切に削除されていない場合にメモリ リークが発生しないのはなぜですか

StackOverflow https://stackoverflow.com/questions/3424957

質問

コードセグメント 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 の内部コードは私には同じように見えます。

役に立ちましたか?

解決

重要なルール:あなたはdeleteによって作成されたものでnewを使用しなければならない、とあなたが削除しないようにしてください何か

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

あなたは(aString()に一致するように、new[]を使用して)それを終えたとき、あなたはそれを削除しなければならないので、

delete[]は、new[]を使用して作成されたバッファへのポインタを返します。これは、(stringwstring、コンテナとスマートポインタのような)利用資源管理型クラスへという生のポインタの周りに渡すと、それらが正しく扱われることを望んより良い練習である理由である、エラーが発生しやすいです。

他のヒント

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

から抜粋 basic_string::c_str() MSDN のドキュメント:

返されたCスタイルの文字列はそうすべきではありません これにより、文字列へのポインターが無効になる可能性があるため、変更されました。 文字列の寿命は限られており、クラス文字列が所有しているため、削除されました.

私は手足に出て行って、wstringのはwchar_tのではないことを言うつもりですが、代わりのwchar_t *を返す演算子を持つクラスは、そうwstringののデストラクタで、それはおそらく独自のコピーを解放しますwchar_t型の*それ戻ります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top