2016-07-14 8 views
-1

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.

Antwort

1

In Queue::dequeue

Node* node = new Node(); 

Ordnet ein neuer Knoten, die Adresse ist sofort überschrieben ist und sickerte durch

node = front; 

beide Linien Austausch mit

Node* node = front; 

sofort node bei front zeigen sollte ausreichen.

wie Miles Budnek darauf hinweist, ist der gleiche Fehler in Queue::print. Tun Sie nicht new, wenn Sie unbedingt müssen, und alle new s muss eine entsprechende delete irgendwo haben.

+0

Das gleiche passiert in 'Queue :: print'. –

+0

@ user4581301 Ich habe das OP mit einigen weiteren Informationen bearbeitet. –

+0

@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

0

Nachdem Sie einen Zeiger verwendet haben, löschen Sie ihn und setzen Sie ihn auf NULL. Beispiel:

char* PotionTypeString(PotionType type) 
{ 
    char* s = "UNKNOWN"; 

    switch (type) { 
    } 
return(s); 
} 

int main() 
{ 
    Queue q; 
    q.enqueue(WISDOM); 
    q.dequeue(); 
    delete s; 
    s = NULL; 
    #ifdef _WIN32 
    #endif 
    return 0; 
} 

Natürlich, für diese arbeiten, s müssen außerhalb PotionTypeString() erklärt werden, damit sie nicht aus dem Rahmen gehen.