2017-09-08 4 views
0

Ich implementierte eine Stack-Klasse, und als ich versuchte, push() aufzurufen, erhalte ich einen Speicherleckfehler (doppelt frei oder Korruption (fasttop)). Hier ist mein Code:C++ Speicherleckfehler beim Implementieren der Stack-Klasse

#include "StackNode.h" 
#include "Stack.h" 
#include <iostream> 
using namespace std; 

Stack::Stack(){ 
    curr = NULL; 
} 

Stack::~Stack(){ 
    while(!empty()) 
    pop(); 
    delete curr; 
} 

bool Stack::empty(){ 
    return curr==NULL; 
} 

int Stack::top(){ 
    return curr->value; 
} 

void Stack::push(int a){ 
    StackNode * temp = new StackNode; 
    temp->value = a; 

    if (!empty())  // atleast 1 element 
    temp->prev = curr; // temp links to current 

    curr = temp;  // current becomes temp 
} 

void Stack::pop(){ 
    if (!empty()){ 
    StackNode * temp = curr; 
    curr->prev = curr; 
    delete temp; 
    } 
} 

ich gedebuggt und verfolgt sie:

temp = curr; 

ich keine andere Art und Weise der Umsetzung der Methode push() sehen kann. Mein StackNode enthält nur einen Standardkonstruktor, der den Zeiger prev auf NULL setzt. Jede Hilfe wäre willkommen. Vielen Dank!

Edit: Hier ist mein StackNode:

#include "StackNode.h" 
#include <iostream> 
using namespace std; 

StackNode::StackNode(){ 
    prev = NULL; 
} 

Und hier mein Haupt ist:

#include <iostream> 
#include "Stack.h" 
using namespace std; 

int main(){ 
    // Stack s; 
    s.push(1); 
    // cout<<s.top()<<endl; 
    cout<<"pass"<<endl; 
    return 0; 
} 
+0

Mit dem, was Sie Habe einen "doppelten freien Fehler" gezeigt, der mit einem einfachen 2- oder 3-Zeilen Programm verursacht werden kann. '{Stapel s; s.push (10); Stack s2 = s;} '. Lies dir die Regel von 3 durch. – PaulMcKenzie

+0

Außerdem musst du dein 'main' Programm zeigen, nicht nur deine Klasse. Es ist, wie Sie die Klasse verwenden, die zählt, und wie ich gezeigt habe, ist es einfach, Ihre "Stack" -Klasse Probleme zu haben. – PaulMcKenzie

+0

Nun, bis jetzt habe ich Main benutzt, um meine Klasse zu testen. Also ich habe nur: Stapel s; s.push (1); – user2999870

Antwort

1

Ich habe drei Fragen.

  1. Stapel :: pop

    void Stack::pop(){ 
        if (!empty()){ 
        StackNode * temp = curr; 
        curr->prev = curr;   // curr = curr->prev ? 
        delete temp; 
        } 
    } 
    
  2. Stapel :: ~ Stapel

    Stack::~Stack(){ 
        while(!empty()) 
        pop(); 
        delete curr;     // Why delete curr here? 
    } 
    
  3. Stapel :: Push

    void Stack::push(int a){ 
        StackNode * temp = new StackNode; 
        temp->value = a;    // temp->prev assign NULL ? 
    
        if (!empty()) 
        temp->prev = curr; 
    
        curr = temp; 
    } 
    
+0

1 und 3: Können Sie das klären? 2: curr ist ein Zeiger, der auf die oberste Ebene des Stapels zeigt. Wenn ich es nicht lösche, wird der Speicher, auf den es zeigt, nicht freigegeben. – user2999870

+0

@ user2999870 is stack ist leer - es sollte kein "top" drin sein. –

+1

@ user2999870 1. curr-> prev = curr; die Währung wäre ungültig. 3. Wenn first-> prev nicht NULL ist. Beim Aufrufen des letzten Elements würde ein Fehler auftreten. –

Verwandte Themen