はい、コードはメモリリークを起こします。動作に関する最初の推測は正しいです。このコード
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node(); // allocate memory 10 times in a loop...
}
delete newNode; // ... but free the memory only once!
メモリを10回割り当てます(ループnew
内の演算子)が、それらのオブジェクトの1つ(下部の演算子)for
のみが使用するメモリを解放します。当然、これにより他の9つのオブジェクトは孤立したままになります。それらが消費するメモリは引き続き割り当てられますが、アクセスして解放する方法はありません。つまり、もちろん、メモリリークの定義そのものです。delete
対照的に、このコード
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node(); // allocate memory 10 times in a loop
delete newNode; // ... and free the memory each time
}
delete
への呼び出しごとに1つの呼び出しがあるため、メモリをリークしませんnew
。これは、覚えておく必要のある大きなルールです。への各呼び出しをnew
、への対応する呼び出しと一致させないdelete
と、メモリリークが発生します。
または、C ++で作業している場合のさらに良いルールは、そもそも生のポインターを使用しないことです。C ++標準ライブラリは、ポインタのRAIIイディオムを実装する、いくつかの優れたラッパークラスを提供します。これにより、ポイントされたオブジェクトが適切に破棄され、それらが消費するメモリが解放されます。お気に入りのC++ブック、またはWikipediaで調査を開始します。