Frage

Ich habe ein Problem mit löschen zu müssen und destructor (Ich bin sicher, ich mache einen dummen Fehler hier, aber nicht in der Lage, es herauszufinden, als der noch).

Als ich in den destructor Schritt durch, und versuchen, auf einen Zeiger löschen zu rufen, die Meldung erscheint „Can not access memory an der Adresse einige Adresse .“

Der entsprechende Code ist:

/*
 * Removes the front item of the linked list and returns the value stored
 * in that node.
 *
 * TODO - Throws an exception if the list is empty
 */
std::string LinkedList::RemoveFront()
{
    LinkedListNode *n = pHead->GetNext(); // the node we are removing
    std::string rtnData = n->GetData(); // the data to return

    // un-hook the node from the linked list
    pHead->SetNext(n->GetNext());
    n->GetNext()->SetPrev(pHead);

    // delete the node
    delete n;
    n=0;

    size--;
    return rtnData;
}

und

/*
 * Destructor for a linked node.
 *
 * Deletes all the dynamically allocated memory, and sets those pointers to 0.
 */
LinkedListNode::~LinkedListNode()
{
    delete pNext; // This is where the error pops up
    delete pPrev;
    pNext=0;
    pPrev=0;
}
War es hilfreich?

Lösung

Es scheint, dass Sie den nächsten und vorherigen Knoten der Liste aus dem destructor löschen. Welche, wenn pNext und pPrev sind LinkedListNode*, bedeutet, dass Sie rekursiv die ganze Liste löschen: - (

Versuchen Sie diese:

std::string LinkedList::RemoveFront()
{
    LinkedListNode *n = pHead->GetNext(); // the node we are removing
    std::string rtnData = n->GetData(); // the data to return

    // un-hook the node from the linked list
    pHead->SetNext(n->GetNext());
    n->GetNext()->SetPrev(pHead);

    n->SetNext(0);
    n->SetPrev(0);
    // delete the node
    delete n;
    n=0;

    size--;
    return rtnData;
}

LinkedListNode::~LinkedListNode()
{
}

(Eigentlich brauchen Sie nicht einmal den zurück und nächsten Zeiger auf 0 zurückgesetzt werden, da Sie den Knoten sowieso löschen gehen. Ich verließ diese Aussagen in, weil sie zumindest die Knoten in einen konsistenten Zustand versetzt, der eine ist gute Idee im allgemeinen. Es kann einen Unterschied machen, wenn Sie später zB die Speichermanagement-Strategie ändern und entscheiden, nicht verwendeten Knoten für eine spätere Wiederverwendung zu speichern.)

Andere Tipps

Es scheint, dass Ihr LinkedListNode seine Nachbarn zu löschen, so dass, wenn Sie einen Knoten löschen geht dann die gesamte Liste zu zerstören -. Hinweis: Sie müssen pNext und pPrev auf NULL gesetzt, wenn Sie Ihren Knoten entfernen

Auch Ihre LinkedListNode destructor problematisch ist auch in dem Fall, wenn Sie die ganze Liste soll zerstört werden. Sowohl delete pNext und delete pPrev mit auf mehrere Anrufe von derselben destructor führen wird (und ich denke, irgendwann einen Stapelüberlauf)

Eigentlich sollte man nicht mit den Nachbarn in einem Knoten verwirren werden. Das ist für Listenklasse zu tun - sie richtig anschließen. Im destructor können Sie sie auf null gesetzt, aber es sei denn, Sie dynamisch etwas anderes zugewiesen haben - Sie müssen nicht delete

verlangen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top