2017-04-26 6 views
0

リンクリスト1:3-> 6>、9-> 15-> 30
リンクリスト2:10-> 15-> 302つは、片方向リンク・リストと同じノードデストラクタ削除同じメモリを共有する二度

リンクリスト1 & 2は、私は2つのリンクされたリストを持っていると私は、プログラムが終了する前に15で交差するノード、リンクされたリストを検索しています15で交差し、同一のノード15及び30

を共有しますデストラクタが呼び出されます。最初のデストラクタ呼び出しは問題なくメモリを解放します。 2番目のリストは、15のノードを削除しようとします。デストラクタは、すでに解放されたメモリを削除しようとしています。これにより、プログラムがクラッシュします。この問題をどうやって解決するのですか?

+3

あなたのリストをクロスリンクしないでください。その短期的には、 'std :: shared_ptr'を使って、ランタイムがそれを並べ替えるようにしてください。 – WhozCraig

+1

コードとエラーを共有してください。 – Awais

+0

最小限の再現可能な例を示してください。 – user31264

答えて

1

まず、リストには一般的に同じノードが含まれるべきではないことを指摘しておきます。リスト間で共有オブジェクトが必要な場合は、ノード自体を共有するのではなく、ノード内のオブジェクトへのポインタまたは参照を保存します。

ノード自体を共有する必要がある場合は、必要なものはreference countingです。

本質的に、ポインタまたは特定のオブジェクトへの参照の数を(変数内で)追跡し、数値が0になったときにのみメモリを解放して、オブジェクトに到達できなくなったことを示します解放されるべきである。

はSTLで参照カウントを行うには、C++ 11以降のSTLである、 shared_ptrを使用しています。

struct node 
{ 
    node(const data_t&); 
    data_t data; 
    std::shared_ptr<node> next; 
}; 

auto head1 = std::make_shared(some_data1); 
auto head2 = std::make_shared(some_data2); 
head1->next = std::make_shared(some_data); 
head2->next = head1->next; 
//note that you do NOT copy the raw pointer, you must copy the shared_ptr itself 

head1.reset(); //destroys some_data1 but not some_data 
head2.reset(); //destroys some_data2 and some_data 
関連する問題