2013-05-14 4 views
-1

Вот код:Указатель теряет значение (упрощенно код)

#include "DynIntStack.h" 


DynIntStack::DynIntStack(void) 
{ 
} 


DynIntStack::~DynIntStack(void) 
{ 
} 

bool DynIntStack::IsEmpty() 
{ 
    return head; 
} 
void DynIntStack::Push(int v) 
{ 
    Element e = Element(v, head); 
    head = &e; 
} 
int DynIntStack::Pop() 
{ 
    if(head) 
    { 
     int r = head->v; 
     head = head->next; 
     return r; 
    } 
} 
int DynIntStack::Top() 
{ 
    if(head) 
     return head->v; 
} 
string DynIntStack::Print() 
{ 
    stringstream ss; 
    ss << "IntStack {"; 
    Element *k = head; 
    while (k) 
    { 
     ss << k->v << ", "; 
     k = k->next; 
    } 
    ss << "}"; 
    return ss.str(); 
} 

указатель «голова», кажется, теряет свою ценность каждый раз, когда я называю толчок. Зачем? Часто элемент головы будет содержать указатель на ITSELF, который невозможен с помощью этого кода ...

ответ

4

Поскольку вы создаете объект в стеке, когда объект выходит из сферы действия, он уничтожается. В результате head становится болтающимся указателем, так как он ссылается на свободную память.

void DynIntStack::Push(int v) 
{ 
    Element e = Element(v, head); 
    head = &e; 
} 

Что вам нужно сделать, это выделить объект на куче, что-то вроде этого:

Element * e = new Element(v, head); 
head = e; 
+0

Спасибо, я не сделал знать C++ имел сборщик мусора – pixartist

+0

@ user1071988: C++ не имеет GC. Но объекты, выделенные на стек, уничтожаются, когда они выходят за рамки. – nogard

+0

Итак, когда точно созданы объекты в стеке? – pixartist

1

Ваша программа выдает неопределенное поведение в Top(). Когда head == NULL, функция ничего не возвращает - после этого все перчатки отключены.

То же самое с Pop, которое также представляется неверным. Запуск кода через отладчик поможет.

+0

Да, я буду исключения положить туда я думаю ... – pixartist

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