C++ Erreur' : free(): pointeur non valide
J'ai lu à travers des problèmes similaires, mais je ne peux pas trouver quelque chose qui traite spécifiquement de mon problème (ou je n'ai tout simplement pas comprendre les autres solutions)
Je suis en train de mettre en œuvre un modèle de classe Stack, et je rencontre un problème lorsque vous essayez de faire un push sur la pile. voici mon 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
push() est appelée à partir d'une fonction dans le gestionnaire de classe:
void Manager::testPush(){
Stack<int> test;
int number = 3;
test.push(3);
}
Lorsque j'exécute le code et les gestionnaires d'appel de testPush() la méthode, j'obtiens le résultat suivant imprimé:
if working
success
*** Error in `./assignment': free(): invalid pointer: 0x0000000000f11078 ***
[1] 14976 abort (core dumped) ./assignment
Je ne suis pas sûr de ce que free() signifie, et ce qui pourrait éventuellement être la cause de cette erreur/abandonner
push
en premier lieu. Vous n'en avez pas besoin. quelque Chose comme ceci de travail, et résoudre votre problème tout en le faisant.J'ai juste essayé votre code, et il me donne la même erreur que ci-dessus
je prie de différer. Si ce code défauts, alors votre faire autre chose de mal dans votre programme. Le lien ici ne laisse pas de doute, il fait exactement ce qu'il devrait.
Ah! my bad, je suis désolé, j'ai essayé la mise en place et il fonctionne... je met le nœud de la classe dans un fichier différent. Est-il préférable de mettre le nœud comme une structure dans le fichier d'en-tête, ou comme une classe comme une autre nœud?
il appartient dans un en-tête, peu importe (c'est un modèle, après tout). Si elle est intégrale avec
Stack<T>
comme une classe imbriquée ou stand-alone est finalement à vous.
OriginalL'auteur Vaderico | 2015-05-26
Vous devez vous connecter pour publier un commentaire.
Il semble que vous avez oublié de mettre le membre de données en regard de la valeur NULL dans le nœud temp.
Si le Nœud de la classe a un constructeur à deux paramètres, ou si c'est un ajout que vous pourriez écrire plus simple
Prendre en compte que le destructeur de la classe Nœud doit supprimer tous les nœuds dans la pile.
Cette fonction
aussi semble douteuse, car le test est une variable locale de la fonction. La pile peut être utilisé uniquement à l'intérieur de la fonction.
Vous avez alloué un nouveau nœud de temp et de définir mHead de temp. Alors maintenant, mHead->next a quelques inderterminate valeur. Ceci est valable à la condition que le constructeur de Noeud<T> ne pas définir ce champ lui-même.
OriginalL'auteur Vlad from Moscow