Der obige Code erfolgreich kompiliert wurde, aber wenn ich versuche, es zu laufen, wirft es einen malloc Fehler:Laufzeitfehler Speicherzuordnung
malloc: * error for object 0x7fdbf6402800: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug
Es sieht aus wie ich einige Objekte zu zerstören versuchte, die nicht waren initialisiert, aber ich konnte nicht herausfinden, wie ich es beheben kann.
#include <iostream>
template <class T>
class Node {
public:
T data;
Node<T>* next;
Node<T>* prev;
Node(): data(), next(nullptr), prev(nullptr) { }
Node(T dt): data(dt), next(nullptr), prev(nullptr) { }
Node(T dt, Node* n): data(dt), next(nullptr), prev(n) { }
T get() { return data; }
};
template <class T>
class Stack {
public:
Node<T>* head;
Node<T>* tail;
Stack(): head(nullptr), tail(nullptr) { }
~Stack() {
Node<T>* temp = head;
while(temp) {
delete temp;
temp = temp->next;
}
}
bool empty() const;
Stack& push(T);
Stack& pop();
};
template <class T>
bool Stack<T>::empty() const {
return head == nullptr;
}
template <class T>
Stack<T>& Stack<T>::push(T x) {
if (head == nullptr) {
head = new Node<T>(x);
tail = head;
}
// It seems that problem occurs here
else {
Node<T>* temp = tail;
tail = new Node<T>(x, tail);
tail->prev = temp;
temp->next = tail;
}
return *this;
}
template <class T>
Stack<T>& Stack<T>::pop() {
if (!head) {
return *this;
}
else if (head == tail) {
delete head;
head = nullptr;
tail = nullptr;
}
else {
Node<T>* temp = tail;
delete tail;
tail = temp;
}
return *this;
}
int main() {
Stack<int> istack;
istack.push(5);
istack.push(3);
istack.push(4);
istack.push(7);
istack.pop();
}
Willkommen bei Stack Overflow. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –
Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –