2017-04-26 1 views
0

verlinkte Liste 1: 3-> 6-> 9-> 15-> 30
verlinkte Liste 2: 10-> 15-> 30Zwei Singly-Linked-List Gemeinsame Nutzung Gleichen Knoten & Destructor löscht gleiche Speicher zweimal

verketteten Liste 1 & 2 intersects bei 15 und teilt die gleichen Knotenpunkte 15 und 30.

I zwei Liste verbunden sind, und I für die schneidende Knoten am searching, die 15. Bevor das Programm beendet ist, die verknüpfte Liste Destruktor wird aufgerufen. Der erste Destruktoraufruf gibt den Speicher ohne Probleme frei. Die zweite Liste versucht dann, ihren eigenen Knoten von 15 zu löschen. Der Destruktor versucht, bereits freigegebenen Speicher zu löschen, wodurch das Programm zum Absturz gebracht wird. Wie löse ich dieses Problem?

+3

Verlinken Sie Ihre Listen nicht. Kurz gesagt, verwenden Sie 'std :: shared_ptr's und lassen Sie die Laufzeitumgebung aussortieren. – WhozCraig

+1

Bitte teilen Sie Code und Fehler. – Awais

+0

Bitte geben Sie das minimal reproduzierbare Beispiel an. – user31264

Antwort

1

Zunächst möchte ich darauf hinweisen, dass Ihre Listen im Allgemeinen nicht denselben Knoten enthalten sollten. Wenn Sie geteilte Objekte zwischen Listen benötigen, speichern Sie Zeiger oder Referenzen auf das Objekt im Knoten, anstatt den Knoten selbst zu teilen.

Wenn Sie den Knoten selbst teilen müssen, ist reference counting.

Im Wesentlichen, was Sie tun, ist die Nummer (in einer Variablen) von Zeigern oder Verweisen auf ein bestimmtes Objekt zu verfolgen, und den Speicher nur freizugeben, wenn die Zahl auf 0 geht und anzeigt, dass das Objekt nicht mehr erreicht werden kann und sollte befreit werden.

Um Referenzzählung mit der STL zu machen, verwenden Sie shared_ptr, die in der STL seit C++ 11 ist.

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 
Verwandte Themen