指针失去价值(简单的代码)

时间:2013-05-14 11:15:43

标签: c++ pointers

以下是代码:

#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的指针,这个代码不应该是......

2 个答案:

答案 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相同,但似乎也未正确实施。通过调试器运行代码会有所帮助。