2015-04-24 43 views
-1
Node::Node(void* value, Node* next) 
{ 
    Value(value); 
    Next(next); 
} 

Node::~Node() 
{ 
    delete value; 
    delete next; 
} 


Stack::Stack() 
{ 
    top = 0; 
} 

Stack::~Stack() 
{ 
    while (!isEmpty()){ 
     Node* node = top; 
     delete top; 
     top = node->Next(); 
    } 
} 

我確定問題是與推。現在,當我用這段代碼運行它時,它給了我一個訪問衝突錯誤。我不知道我在哪裏泄漏內存C++

void Stack::push(void* var) 
{ 
    Node* node = new Node(var, top); 
    top = node; 
    delete node; 
} 

const void* Stack::pop() 
{ 
    void* value = top->Value(); 
    top = top->Next(); 
    return value; 
} 

const void* Stack::peek() const 
{ 
    if (top != 0) 
    { 
     return top->Value(); 
    } 
    else 
     return 0; 
} 

bool Stack::isEmpty() const 
{ 
    return (top == 0); 
} 

我想在代碼中使用堆的數據創建堆棧。我不能擺脫內存泄漏。當我運行這個並推入兩個整數。它告訴我,我正在泄漏16位數據。

+0

事情還教空指針,而不是基本的模板? – chris

+3

'top = node;刪除節點;'...因此'頂部'成爲一個懸掛指針。 –

+0

'Node * node = top;刪除頂部; top = node-> Next();'也被打破了--'節點'指向剛剛被刪除的對象,所以你不能取消引用它來訪問'Next'。也許'while(!isEmpty())delete pop();'。但是 - 請注意,刪除一個'void *'不會調用任何特定於類型的析構函數,所以執行'myStack.push((void *)new std :: string(「hello!」))是不安全的。 ;' - std :: string'析構函數在堆棧被銷燬時不會被調用。 –

回答

1
void Stack::push(void* var) 
{ 
    Node* node = new Node(var, top); 
    top = node; // don't delete the created node, that is job of pop 
       // otherwise u deleted the node u just pushed !! 
} 

const void* Stack::pop() 
{ 
    void* value = 0; 
    if (top) 
    { 
     value = top->Value(); 
     Node* nextTop = top->Next(); 
     delete top; // this would be correct! 
     top = nextTop; 
    } 
    return value; 
} 

Stack::~Stack() 
{ 
    while (!isEmpty()) 
     pop(); 
} 

應該這樣做!

但是,爲什麼要實施堆棧,如果你可以使用STL?爲什麼原始指針?爲什麼void *使用模板。

如果你有C++,使用它的大部分功能,而不僅僅是類

+1

固體開始 - 你的代碼修復了'push'和'pop' - 但是FWIW Stack ::〜Stack()'也被破壞了...... –

+0

它是一個學校和我需要使用無效的項目* –

+0

我有擺脫我的節點解構器裏面的東西,讓它與我所說的一起工作。我愛你,我在這個小時上非常感謝你。 –