Main.cppWarum bekomme ich hier ein Speicherleck?
#include<iostream>
#include "Queue.h"
using namespace std;
char* PotionTypeString(PotionType type)
{
char* s = "UNKNOWN";
switch (type) {
case SPEED:
s = "Speed";
break;
case STRENGTH:
s = "Strength";
break;
case HEALTH:
s = "Health";
break;
case WISDOM:
s = "Wisdom";
break;
}
return(s);
}
int main()
{
Queue q;
q.enqueue(WISDOM);
q.dequeue();
#ifdef _WIN32
if (_CrtDumpMemoryLeaks()) {
cout << "Memory leaks!" << endl;
} else {
cout << "No leaks" << endl;
}
#endif
return 0;
}
Queue.cpp
#include "Queue.h"
#include <string.h>
#include <iostream>
using namespace std;
Queue::Queue() {
front = NULL;
rear = NULL;
size = 0;
}
Queue::~Queue() {
Node* cur = front;
while (cur != NULL) {
Node* temp = cur->next;
delete cur;
cur = temp;
}
}
void Queue::enqueue(PotionType type) {
Node* node = new Node();
node->type = type;
if (front == NULL) {
front = node;
}
else {
rear->next = node;
}
rear = node;
size = size + 1;
}
PotionType Queue::dequeue() {
PotionType toRet;
if (front != NULL) {
Node* node = new Node();
node = front;
front = front->next;
toRet = node->type;
delete(node);
size = size - 1;
}
return toRet;
}
void Queue::print() {
if (front == NULL) {
cout << "Empty list" << endl;
}
else {
Node * toPrint = new Node();
toPrint = front;
while (toPrint != NULL) {
cout << PotionTypeString(toPrint->type) << endl;
toPrint = toPrint->next;
}
}
}
In der Hauptfunktion ich ein einzelnes Element nur eine leere Queue instanziiert, ein einzelnes Element hinzufügen, dann de-Warteschlange, und ich bekomme Speicherlecks, ich fühle, dass es etwas mit meiner Dequeue-Methode oder meinem Destruktor zu tun hat ...
Obwohl ich bin irgendwie neu in C++, also bin ich nicht ganz sicher.
Wer ist bereit, mir hier zu helfen?
Edit:
ich in den Änderungen von user4581301 vorgeschlagen setzen, und es ist meine Speicherverlust Problem behoben, wenn sie nur
Queue q;
q.enqueue(WISDOM);
q.dequeue();
Jedoch geht, wenn ich die q.dequeue() entfernen und ihn verlassen Bis zum Destruktor bekomme ich dann ein Speicherleck.
Das gleiche passiert in 'Queue :: print'. –
@ user4581301 Ich habe das OP mit einigen weiteren Informationen bearbeitet. –
@DylanHolmes 'Queue q;' weist eine statische 'Queue' zu, die erst nach dem Beenden der 'main'-Funktion zerstört wird. Dies ist nach Ihrem Aufruf an den Leckprüfer. Wenn Sie stattdessen den Gültigkeitsbereich von "q" reduzieren und dann den Leak-Checker aufrufen, ist das Leck entweder verschwunden oder Sie haben einen Fehler im Destruktor. Versuchen Sie Folgendes: '{Queue q; q.enqueue (WISDOM);} '' q' wird an der schließenden geschweiften Klammer und vor dem Leck Checker zerstört werden. Ich empfehle, [Was ist die Regel der Drei?] (Http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) zu lesen, weil sie wahrscheinlich die nächste, noch nicht gestellte Frage beantworten wird. Frage. – user4581301