2012-02-11 12 views
14

私が発見した、次のように古典的な新しい/私たちのコードベースでの不一致エラーを削除します。新規/削除演算子のミスマッチエラーはどのくらい深刻ですか?

char *foo = new char[10]; 

// do something 

delete foo; // instead of delete[] foo; 

これがどれだけ深刻なのですか?メモリリークやエラーの原因になりますか?結果は何ですか?我々はいくつかのメモリの問題を持っているが、これはすべて私たちの症状(ヒープ破損など)を説明するのに十分な深刻なようではありません

EDIT:明瞭
ための余分な質問それだけで、配列の最初のメンバーを解放していますか?または
システムはアレイのトラックを失いますか?または
壊れたメモリは何らかの方法ですか?

答えて

16

これは未定義の動作が重大です(動作する可能性があり、クラッシュする可能性があります。

+0

素早くお返事ありがとうございます。だから本当に未定義?のように、誰も何が起こるか教えていただけませんか?それがそうであれば、私たちの観察を説明するかもしれません。 @AndrewS。 –

+0

確かに定義されていない。たとえば、Visual Studioで "働いていた"ことを覚えています。 – cnicutar

+2

未定義 - つまり、コンパイラ/ OSによって異なります。 –

8

delete[]の代わりにdeleteを呼び出すと、あまり悪くないはずです。最初のオブジェクトを破棄してメモリリークを引き起こします。

しかしは:その後、delete(またはdelete[])がメモリを解放するfreeを呼び出します。 freeは、メモリを正しく解放するために、当初割り当てられたアドレスを必要とします。あるいは、newはmallocによって割り当てられた元のアドレスを返しますが、new[]の別のアドレスを返します。

new[]によって返されたアドレスで無料で電話をかけた場合、クラッシュが発生します(メモリが無秩序に解放されます)。 delete[]を呼び出す代わりに削除することも非常に悪い考えですなぜそれがまた明らかであるこれらの記事から

http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx#66782

http://web.archive.org/web/20080703153358/http://taossa.com/index.php/2007/01/03/attacking-delete-and-delete-in-c

は、より良い理解のためにこれらの非常に有益なリンクを参照してください。

回答:はい、非常に重大なエラーです。メモリを破壊します(最初のオブジェクトのデストラクタのみを呼び出した後)。

関連する問題