Destructor verursacht einen Segmentation Fault
Ich weiß, dass es viele ähnliche Fragen gibt, aber ich habe nicht gefunden was hilft noch. Ich beschäftige mich jetzt schon seit mehreren Stunden jetzt, und es macht mich verrückt. Ich bekomme einen segmentation fault, wenn ein Destruktor wird aufgerufen, eine variable, die erstellt wurde, indem der copy-Konstruktor.
//Copy Constructor
Stack::Stack(const Stack &aStack)
{
size = 0; //this is incremented as new items are pushed onto the stack.
cap= aStack.cap;
items = new int[aStack.cap]();
for (int i = 0; i < aStack.size; i++)
this->push(aStack.items[i]); //Adds an item if not full and increments size
//I have also tried: items[i] = aStack.items[i]
}
//Destructor
Stack::~Stack()
{
cap= 0;
size= 0;
delete [] items;
items = NULL;
}
Bekomme ich das Gefühl, ich mache die Kopie-Konstruktor falsch, aber ich kann nicht herausfinden, was es ist.
Sollten Sie keine Schleife, um die Größe anstelle der top-element? Und tun stacks haben in der Regel schwenkbare Elemente?
Und
Warten Sie, warum ist
Sorry, ich sollte angegeben haben. Ich Baue ein stack aus einem array. Also immer wenn Sie sehen, das Wort stack, es ist die Klasse "stack", und es enthält einen dynamisch zugewiesenen Arrays.
Versuchen Sie, die Initialisierung
Und
top
ist nie für das neue Objekt in den copy-Konstruktor.Warten Sie, warum ist
top
keine Funktion (ich würde behaupten das gleiche für size
auch wenn es nicht ein)?Sorry, ich sollte angegeben haben. Ich Baue ein stack aus einem array. Also immer wenn Sie sehen, das Wort stack, es ist die Klasse "stack", und es enthält einen dynamisch zugewiesenen Arrays.
Versuchen Sie, die Initialisierung
size
Mitglied vor Aufruf push()
InformationsquelleAutor Atrus | 2013-05-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Zeile:
werden sollte:
Ist es seg fehlgeschlagenes weil Sie wahrscheinlich beim Zugriff auf ein außerhalb des Bereichs-index oder so ähnlich (Undefiniertes Verhalten territory).
Ich bearbeitete die ursprüngliche Frage ja die Namen sind klarer.
Welche Art Gegenstände? Wird es deklariert als int*?
yep, int *Elemente;
Der code funktioniert, die meisten der Zeit, es ist halt Besondere Situationen, wo es scheitert, nämlich Situationen, in denen copy-Konstruktor verwendet wird.
InformationsquelleAutor Ozraptor
Gut, ich habe es gefunden. Ich werde es hier für alle so dumm, wie ich bin (fehlen grundlegende c++ Kenntnisse), damit Sie nicht verbringen Stunden auf der Suche für die gleiche Sache, die ich war.
Mein problem war, dass der Destruktor schien zu arbeiten "punktuell." Es war für einige tests, aber nicht in anderen. Nach einem Vergleich der tests für Stunden, ich habe es endlich gefunden.
Tests versagten fertig und testen Sie die pop-Funktion, fortsetzen, bis der stack leer war.
In meinem Destruktor, gibt es eine Zeile, die sagt
delete [] items;
Das wäre gut, außer das mein pop-Funktion hatte eine Linie, die Lesen
items[size-1] = NULL;
Also in einer Weise, jedes mal, wenn pop-entfernt ein Element, es wurde GENULLT/gelöscht werden, bevor der Destruktor aufgerufen wurde. Aufgrund meiner sehr grundlegende Kenntnisse in c++, ich war nicht bewusst, dass der delete-Befehl konnte nicht mit leeren arrays. Also, habe ich mich einfach entfernen Sie die Zeile, die gelöscht, das Element vor der Zeit (im wesentlichen, um die end-Benutzer, wird das Element nicht mehr existiert, weil der Kapselung. Der Obere index immer noch Veränderungen, so ist es nicht mehr zugänglich)
Sowieso, Letzte Lektion:
delete [] items
; nicht um leere arrays (was Sinn macht denke ich. Der delete-Befehl erwartet ein array viel länger als meine Letzte array war, sich heraus zu sein).NULL
ist ein makro effektiv definiert als0
. Also alle diese Zeile Tat, war eines von den ganzen zahlen in dieitems
array0
. Es sollte keine Wirkung auf diedelete
im Destruktor. Hast, Ruf Sie andelete items[size - 1]
als auch inpop
?Die Abtretung als solche ist nicht der Grund - die Zuordnung
NULL
nicht dazu führen, dass nichts gelöscht werden. Insbesondere die ZuordnungNULL
zu einemint
wird nur setzen Sie ihn auf null, und ein array voller Nullen ist nicht "leer" in keiner Weise. Wahrscheinlicher ist, dasssize-1
ist ein index außerhalb der array - stellen Sie sicher, dasssize
ist größer als null, wenn Sie das tun.InformationsquelleAutor Atrus