C++ 错误:free():无效指针

C++ Error in ' ' : free(): invalid pointer

本文关键字:无效 指针 free 错误 C++      更新时间:2023-10-16

我已经阅读了类似的问题,但我找不到任何具体解决我的问题(或者我只是不理解其他解决方案)

我试图实现一个模板堆栈类,当试图推到堆栈时,我有一个问题。这是我的Stack.cpp:

#ifndef _STACK_H
#define _STACK_H
#include <string>
#include <stdio.h>
#include "Node.cpp"
template<typename T>
class Stack{
    private:
        Node<T>* mHead; 
    public:
        Stack();
        ~Stack();
        void push(T data);
};
template<typename T>
Stack<T>::Stack(){
    mHead = NULL;
}
template<typename T>
Stack<T>::~Stack(){
    delete mHead;
}
template<typename T>
void Stack<T>::push(T data){        // <-- having trouble with this method
    Node<T>* temp = new Node<T>;
    temp->data = data;
    //if head is already empty, just create 1 Node
    if(mHead==NULL){
        printf("if workingn");
        mHead = temp;
    }else{
        printf("else workingn");
        //rearrange Nodes
        temp->next = mHead;
        mHead = temp;
    }
    printf("successn");
}
#endif

push()从管理器类中的函数调用:

void Manager::testPush(){
    Stack<int> test;
    int number = 3;
    test.push(3);
}

当我运行代码并调用管理器testPush()方法时,我得到以下打印:

if working
success
*** Error in `./assignment': free(): invalid pointer: 0x0000000000f11078 ***
[1]    14976 abort (core dumped)  ./assignment

我不确定free()是什么意思,以及什么可能导致这个错误/abort

似乎您忘记在节点temp中设置NULL旁边的数据成员。

template<typename T>
void Stack<T>::push(T data){        // <-- having trouble with this method
    Node<T>* temp = new Node<T>;
    temp->data = data;
    temp->next = NULL; // <=== add this statement
    //if head is already empty, just create 1 Node
    if(mHead==NULL){
        printf("if workingn");
        mHead = temp;

如果Node类有一个带两个参数的构造函数,或者它是一个聚合,你可以编写更简单的

template<typename T>
void Stack<T>::push( const T &data )
{
    mHead = new Node<T> { data, mHead };
}

考虑到Node类的析构函数必须删除堆栈中的所有节点。

这个函数

void Manager::testPush(){
    Stack<int> test;
    int number = 3;
    test.push(3);
}

看起来也很可疑,因为test是函数的局部变量。栈只能在函数内部使用