C ++ - 具有链接列表的堆栈 - 错误的内存错误?

时间:2010-11-02 23:52:04

标签: c++ stack linked-list

我目前正在编写正在使用链表实现的堆栈。我收到这个错误:

Unhandled exception at 0x75249617 in STACK_LinkedList.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x002ee8f8. 

我相信它可能来自我的push()pop()函数。我找不到我的错误。我对链表很新,所以我发现错误有点困难。

这是我的push()功能:

// Adds an item to the top of the stack
template <class S>
void Stack<S>::push(const S & e)
{
    NodePointer temp = new Node(e);

    if ( isEmpty() )
    {
        theTop = theFront = temp;
    }
    else
    {
            // Whatever is after top is stored in temp to keep track of it
        theTop->next = temp;

            // TheTop is stored in temp
        theTop = temp;  
        delete temp; 
    }
}

这是我的pop()功能:

//Takes the item off the top of the stack
template <class S>
void Stack<S>::pop()
{
    if ( !isEmpty() )
    {        
                //temp node is set equal to the front
        NodePointer temp = theFront;

                //Holds the second to last node in the linked list
        NodePointer pred;

                //loops through until the node after temp is 0
        while (temp->next != 0)
        {
                        //sets the second to last as temp
            pred = temp ;

                        //basically "increments" temp to the next node
            temp = temp->next ;
        }

                //sets temp equal to the top
        temp = theTop;

                //the top is then set to its predecessor
        theTop = pred;

                //deletes what was known as the top
        delete temp;
    }

    else
        cout << "STACK IS EMPTY" << endl;

}

非常感谢!我相信我的大多数逻辑是正确的。我只是错过了一些小事。如果是其他的请告诉我,我会发布该代码。

2 个答案:

答案 0 :(得分:2)

您的推送功能正在删除“temp”。但是,temp指向刚刚添加到列表中的数据。如果在指针上调用delete,则不是丢弃指针,而是删除它指向的内存!在推送中删除你的删除语句并首先测试(没有弹出)。我没有查看你的pop函数,但是在测试pop()之后我将把它作为练习让你检查错误。

-Dan8080

答案 1 :(得分:2)

您不应该删除temp中的push!这是列表的一部分。因此,当您稍后访问此数据时,您肯定会例外。

其次,您必须在pred中使用NULL初始化pop(),否则如果堆栈仅包含1个项目,您将获得分配给theTop的未定义值

第三,您应该在pop()中删除您在push()中分配的节点。

一般来说,您的方法似乎效率不高。您应该更好地存储指针的其他方式:从堆栈顶部到底部项目。这样,您就不需要遍历每个pop()上的整个堆栈。你的代码将是这样的:

void push(data)
{
    allocate new top
    new top's next is the old top
    store new top in the class
}

void pop()
{
    if empty, ERROR;
    new top = old top's next
    deallocate old top
}

请注意,您根本不需要theFront