0

这是代码:

#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 的指针,这在这段代码中是不可能的......

4

2 回答 2

4

因为您在堆栈上创建对象,所以当对象超出范围时,它会被销毁。结果head变成了悬空指针,因为它引用了释放的内存。

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

您需要做的是在堆上分配对象,如下所示:

Element * e = new Element(v, head);
head = e;
于 2013-05-14T11:17:13.320 回答
1

您的程序在Top(). 当 时head == NULL,该函数不返回任何内容 - 之后所有手套都关闭。

与 相同Pop,这似乎也执行不正确。通过调试器运行代码会有所帮助。

于 2013-05-14T11:16:35.603 回答