所有指针未释放的原因?

The reason why all pointers not-freed?

我正在使用链表实现堆栈数据结构,构建 destroyStack() 函数,一旦我完成使用堆栈 class ,我可以通过该函数释放所有分配的内存,因为我执行了我期望得到的 main调用 destroyStack() 后释放的所有指针。

class Stack{
    private:
        int size;
        typedef struct Node{
            stackType data;
            struct Node *last;
        } Node;
        Node *top;

    public:
        Stack(){
            size = 0;
            top = NULL;
        }

        void push(stackType element){
            Node *temp = new Node();
            if (!temp)
                throw invalid_argument("heap overflow");

            if (element != '[=10=]'){
                temp->data = element;
                temp->last = top;
                top = temp;
                size++;
            }
            else{
                throw invalid_argument("invalid element");
            }
        }

        stackType pop(){
            if (empty())
                throw invalid_argument("this is an empty stack");
            Node *temp = new Node();
            stackType element = top->data;
            temp = top;
            top = top->last;
            temp->last = NULL;
            delete(temp);
            size--;
            return element;

        }

        void destroyStack(){
            Node *temp = top;
            while (top != NULL){
                top = top->last;
                delete(temp);
                temp = top;
            }
        }

};


int main(){

    Stack stack;
    stack.push(100);
    stack.push(90);
    stack.push(80);

    stack.printStack();
    for (int i = 0; i < 3; i++)
        cout << stack.pop() << endl;

    stack.destroyStack();
    return 0;
}

当我使用 valgrind 检查是否有任何类型的泄漏时,我发现了这条消息。

==53372== HEAP SUMMARY:
==53372==     in use at exit: 48 bytes in 3 blocks
==53372==   total heap usage: 8 allocs, 5 frees, 73,824 bytes allocated
==53372== 
==53372== Searching for pointers to 3 not-freed blocks
==53372== Checked 116,952 bytes

所以有什么想法吗?我如何编辑我的代码以在使用销毁功能后释放所有块?

正如@AlanBirties 已经在评论中提到的,问题是 Node *temp = new Node(); 在你的 pop() 函数中。

  • 你必须为每个 new 做一个 delete,所以你不会删除那个块。
  • 但是,您甚至不需要那个新节点...因为该指针的目的是保存最后一个已经存在的顶级节点,而不是新节点。
// Problematic code:
Node *temp = new Node();
temp = top; // previous new node is not freed and never used

// Correct code:
Node *temp = top; // no useless memory allocated

您已经在 destroyStack() 中这样做过 ;)