2012-05-11 11 views

答えて

3

deleteを組み合わせると、未定義の動作が発生するため、その時点以降に起こっている有用なものはカウントできません。一般的に、より便利です

非公式の答えは、あなたが(deletenew[])この操作を行う際にどのような通常起こることは、メモリブロックは、デストラクタは内のオブジェクト上で呼び出されませんヒープ、しかしに返されるということであるということです配列。つまり、これらのオブジェクトは正しく破棄されません。しかし、占有されたメモリは解放されます。メモリのブロックが解放されたことを確認するだけなので、_CrtMemDumpAllObjectsSince()は問題に気づくことはありません。あなたが実際に(代わりにdelete stuff;delete [] stuff;を使用する場合、簡単なチェックをして、そのままこれはおそらく、メモリリークが発生します

class stupid { 
    char *junk; 
public: 
    stupid() { junk = new char[10]; } 
    ~stupid() { delete [] junk; } 
}; 

int main() { 
    stupid *stuff = new stupid[10]; 

    delete stuff; 
    // delete [] stuff; 
    _CrtMemDumpAllObjectsSince(NULL); 
    return 0; 
} 

、それを漏れて終了します。一方

は、このような何かを考えます私は少なくとも私のためにフラットアウトはそのままの状態でクラッシュするので、リークレポートはまだ得られないかもしれませんが、急いで間違っていることを間違いなく知っています。

+0

ありがとうございます。私はあなたの例でプログラムがクラッシュする理由をもう一つ疑っています。私は警告を受けましたが、何か間違っています... –

+1

@ShashankJain:私は正直には分かりません - 私はそれが実行されることを期待しましたが、メモリリークを生成します。私は何が起こっているのか分かりにくいと思うのですが、それはなぜ起こっているのか理解するのに時間を費やすつもりはありません。数年でそうしていない)。 –

0

配列に使用されているVisual C++の削除演算子は、予測できない結果を記録しています。私はあなたがintの配列を持っているので、メモリが正しく解放されているため、配列intの各要素は破壊されなければ副作用がないためだと思います。

は、各オブジェクトが何かのために独自のメモリを割り当て、デストラクタでそれを解放し、ユーザー定義型の配列と同じことをやってみてください。私はあなたが異なる結果を持つと信じています。