Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;'中的错误';:free():无效指针_C++_Templates_Free_Abort - Fatal编程技术网

C++ C++;'中的错误';:free():无效指针

C++ C++;'中的错误';:free():无效指针,c++,templates,free,abort,C++,Templates,Free,Abort,我读过类似的问题,但我找不到任何具体解决我问题的方法(或者我根本不理解其他解决方案) 我正在尝试实现一个模板堆栈类,在尝试推送到堆栈时遇到了一个问题。这是我的Stack.cpp: #ifndef _STACK_H #define _STACK_H #include <string> #include <stdio.h> #include "Node.cpp" template<typename T> class Stack{ private:

我读过类似的问题,但我找不到任何具体解决我问题的方法(或者我根本不理解其他解决方案)

我正在尝试实现一个模板堆栈类,在尝试推送到堆栈时遇到了一个问题。这是我的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 working\n");
        mHead = temp;
    }else{
        printf("else working\n");
        //rearrange Nodes
        temp->next = mHead;
        mHead = temp;
    }
    printf("success\n");
}

#endif


我不确定free()是什么意思,也不确定可能是什么原因导致了此错误/中止

您似乎忘记了在node temp中将data member设置在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 working\n");
        mHead = temp;
模板
void Stack::push(T data){//data=data;

Tim-> Next=NULL;//在修复这一点时,首先考虑一下为什么在<代码> Pux
中有一个IF。你不需要它。它会起作用,并且在这样做时解决问题。@ WoZoCrigg我只是尝试了你的代码,它给了我和上面一样的错误。如果那个代码出错,那么你在程序中做了其他错误。链接离开了。毫无疑问,它正是它应该做的。@WhozCraig啊!我的错,我很抱歉我尝试了你的实现,它工作了…我把节点类放在一个不同的文件中。更好的做法是将节点作为结构放在头文件中,还是将节点作为一个单独的节点放在一个类中?它无论如何都属于头文件(毕竟它是一个模板)。它是作为嵌套类集成在堆栈中还是作为独立类集成在堆栈中最终取决于您。我不确定在将temp->data设置为传入参数数据后,为什么要将其设置为null。(我想创建一个新节点,并用传入push的数据填充它)@Vaderico您分配了一个新的节点temp,并将mHead设置为temp。因此,现在mHead->next有一些inderterminate值。如果节点的构造函数本身没有设置此字段,则此值是有效的。
if working
success
*** Error in `./assignment': free(): invalid pointer: 0x0000000000f11078 ***
[1]    14976 abort (core dumped)  ./assignment
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 working\n");
        mHead = temp;
template<typename T>
void Stack<T>::push( const T &data )
{
    mHead = new Node<T> { data, mHead };
}
void Manager::testPush(){
    Stack<int> test;
    int number = 3;
    test.push(3);
}