2016-04-22 10 views
3

コード:私はこのコードがメモリをリークしていないと言うことで修正リンクリストの実装でメモリがリークしていますか?

struct LinkedList { 
    int someData; 
    LinkedList* next; 

    LinkedList() : next(0) {} 
    ~LinkedList() {delete next;} 
}; 

void someFunction() { 
    LinkedList list; 

    list.next = new LinkedList; 
    list.next->next = new LinkedList; 
    list.next->next->next = new LinkedList; 
    // And so on... 
} 

アム?リストスコープのときは、デストラクタを呼び出す必要があります。このデストラクタは、delete 0が呼び出されるまでnextのデストラクタを呼び出し、nextのデストラクタを呼び出します。

+0

いいですね。しかし、なぜあなたはそれをしますか? –

+0

メモリプロファイラを投げてチェックしてください。 Valgrindは良いものです。 –

+2

デストラクタがスタックのサイズを超えるように多くの項目をリストに入れるまでは問題ありません。 –

答えて

5

あなたのコードはメモリをリークしません。 listが範囲外になると、それは削除され、連鎖反応は最後の要素まですべての次の要素を削除します。

ただし、コードはrule of 3を尊重しません。そのため、LinkedListを割り当てるかコピーをコピーするとすぐに、そのnextポインタがシャローコピーされます。削除/破棄される2つのコピーのうち最初のものが削除されます。もう一方は、もはや有効ではないポインタを使って動作し、UBの原因となるポインタも削除します。

0

deletenewが呼び出されている回数だけ呼び出すと、問題ありません。この場合、これが発生します。

現在のノードにいる場合は、次のノードへのポインタを保持して、現在のノードを削除する必要があります。

は、私はあなたが malloc() newとして及び deleteなど free()「考える」ことができ List (C)、中に持っている例を参照してください。

関連する問題