1. ホーム
  2. c++

[解決済み] C++ Error in ' : free(): invalid pointer

2022-02-06 15:18:31

質問

同じような問題に目を通しましたが、私の問題を具体的に解決するものが見つかりません(あるいは、単に他の解決策を理解していないだけです)。

Stackクラスのテンプレートを実装しようとしていますが、スタックにプッシュしようとすると問題が発生します。

#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

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()の意味がよくわからないし、何が原因でこのエラー/中止が発生するのかもわからない。

どうすればいいですか?

ノード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 working\n");
        mHead = temp;

Node クラスが 2 つのパラメータを持つコンストラクタを持つ場合、またはそれが集合体である場合は、より単純に次のように書くことができます。

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 は関数のローカル変数だからです。スタックは関数内でのみ使用可能です。