为什么我在删除函数freeTheMemory中的指针后得到核心转储?

时间:2017-03-14 22:15:52

标签: c++ stack push pop

我正在开发一个在堆栈上执行基本推送和弹出的程序。我已经完成了GDB中的程序,一切正常,直到程序在freeTheMemory函数中遇到第五行。每次程序到达那里,它都会给我一个核心转储:

#include<iostream>
using namespace std;

class linkedList{
public:
    int content;
    linkedList* pointerToBelow;
};

void freeTheMemory(linkedList *above){
    if(above!=nullptr){
        linkedList* temp;
        temp=above;
        above=above->pointerToBelow;
        delete temp;
        freeTheMemory(above);
    }
}

void push(linkedList* above, linkedList* below, int x){
    below->content=x;
    above->pointerToBelow=below;
    below=above;
    above=new linkedList;
    return;
}

void pop(linkedList* above, linkedList* below){
    linkedList* temp;
    temp=above;
    above=below;
    below=below->pointerToBelow;
    delete temp;
    return;
}

void printList(linkedList *above){
    linkedList* temp;
    temp=above;
    above=above->pointerToBelow;
    while(above!=nullptr){
        cout<<above->content<<" ";
        above=above->pointerToBelow;
    }
    above=temp;
}

int main(){
    linkedList *above, *below;
    int x;
    above=new linkedList;
    below=new linkedList;
    below->pointerToBelow=nullptr;
    cout<<"Enter the elements of your list: ";
    while(x!=-9){
        cin>>x;
        if(x!=-9){
            if(x>0){
                push(above, below, x);
            }
            else{
                pop(above, below);
            }
        }
    }
    printList(above);
    freeTheMemory(above);
    return 0;
}

如果我在哪里获得核心转储,我的代码中的问题是什么?如果是这样,有没有人知道这里出了什么问题?感谢

1 个答案:

答案 0 :(得分:2)

您的解决方案存在逻辑缺陷。它实际上并不保留堆栈中的所有元素,因为您正在创建节点并将其指针分配给局部变量,因此不会逐字地添加到链接列表中。此外,您的代码不必要地复杂,部分原因是使用了两个指针。因此你很难调试。由于您使用链表实现堆栈,我认为只有一个指针就足够了。

下面我修改了你的解决方案。我保留一个名为top的指针,它是一个指向堆栈顶部的虚拟节点。它的pointerToBelow指向堆栈的真正顶部元素。

push执行以下操作:

  1. 创建新节点并将其content设置为x
  2. 将其pointerToBelow设置为堆栈的上一个顶部元素
  3. pointerToBelow top指向此新节点。
  4. pop执行以下操作:

    1. 如果堆叠中没有元素,只需返回,否则为
    2. 获取pointerToBelow的{​​{1}}指向堆栈顶部元素下方的元素。
    3. 删除堆栈的顶部元素。
    4. top ,您不一定需要递归。但那没关系。

      pointerToBelow