以下是代码:
#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();
}
每次调用push时,“head”指针似乎都会丢失它的值。为什么? 通常,head元素将包含一个指向ITSELF的指针,这个代码不应该是......
答案 0 :(得分:4)
因为你在堆栈上创建了对象,所以当对象超出范围时它会被破坏。结果head
成为悬空指针,因为它引用了释放的内存。
void DynIntStack::Push(int v)
{
Element e = Element(v, head);
head = &e;
}
您需要做的是在堆上分配对象,如下所示:
Element * e = new Element(v, head);
head = e;
答案 1 :(得分:1)
您的程序会在Top()
中显示未定义的行为。当head == NULL
时,该功能不会返回任何内容 - 之后所有手套都会关闭。
与Pop
相同,但似乎也未正确实施。通过调试器运行代码会有所帮助。