2015-04-24 4 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); 
} 

Я пытаюсь создать стек в коде, используя кучу для данных. Я не могу избавиться от утечки памяти. Когда я запускаю это и нажимаю два ints. Это говорит мне, что я просачиваю 16 бит данных.

+0

вещи до сих пор учат недействительные указатели вместо базовых шаблонов? – chris

+3

'top = node; delete node; '... whereupon' top' становится висящим указателем. –

+0

'Узел * node = верх; delete top; top = node-> Next(); 'также не работает -' node' указывает на только что удаленный объект, поэтому вы не можете разыгрывать его для доступа к '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? почему raw указатели? почему void * использовать шаблоны.

Если у вас есть C++, использовать большую часть своих функций, а не только классы

+1

Твердый старт - ваш код исправляет 'push' и' pop' - но FWIW 'Stack :: ~ Stack()' также не работает ... –

+0

Его проект в школе и им необходимо использовать пустоту * –

+0

У меня был чтобы избавиться от того, что внутри моего деконструктора узла, чтобы заставить это работать с тем, что я сказал, что Я ЛЮБЛЮ ТЕБЯ, ЧТО Я БЫЛО НАСТОЯЩИМ ДЛЯ ЧАСОВ, СПАСИБО ВАМ ТАК МОЖНО. –

Смежные вопросы