2011-08-24 3 views
2

Mon programme d'exécution ne fonctionnera pas correctement, pour une raison quelconque.Le programme a terminé de façon inattendue

#include <QtCore/QCoreApplication> 
    #include <tinyxml/tinyxml.h> 
    #include "classowner.h" 
    #include "character.h" 

    int main(int argc, char *argv[]) 
    { 
     Character * holland = new Character("Holland", HUMAN, MALE); 
     delete &holland; 
     std::cout << "Hello, World!" << std::endl; 

     return 0; 
    } 

Tous mes états de sortie sont que le programme ne s'exécutera pas correctement. La sortie ne s'affiche pas, cependant quand je n'alloue pas l'objet, il le fera. Évidemment, c'est l'objet. Qu'est-ce que je fais mal?

Mise à jour

Il semble que le problème peut être quelque chose de plus que la suppression et l'allocation de mémoire. Ainsi, je vais poster l'implémentation derrière la classe Character.

tête:

#include <iostream> 
#ifndef CHARACTER_H 
#define CHARACTER_H 

enum Race {HUMAN, DARK_ELF}; 
enum Gender {MALE, FEMALE}; 
class Character 
{ 
public: 
    Character(); 
    Character(std::string char_name, Race char_race, Gender char_gender); 
    ~Character(); 

    int get_id() { return this->char_id; } 
    std::string get_name() { return this->name; } 
    Race get_race() { return this->race; } 
    Gender get_gender() { return this->gender; } 

private: 
    int char_id; 
    static int * char_count; 
    std::string name; 
    Race race; 
    Gender gender; 
}; 



    #endif // CHARACTER_H 

// Source:

#include "character.h" 
#include <iostream> 

int * Character::char_count = 0; 

Character::Character() 
{ 
    this->char_id = *char_count; 
    char_count++; 
} 

Character::Character(std::string char_name, Race char_race, Gender char_gender) 
{ 
    this->char_id = *char_count; 
    char_count++; 
    this->name = char_name; 
    this->race = char_race; 
    this->gender = char_gender; 
} 

Character::~Character() 
{ 

} 
+0

vous supprimez la mémoire qui contient le pointeur sur votre objet réel, ce qui pourrait ne pas être dans le tas/mémoire dynamique Libération. Bien que vous ayez une exception. Parfois, libérant une mauvaise mémoire pourrait vous finir dans une corruption de mémoire grave qui nécessite beaucoup d'efforts pour comprendre! – sarat

Répondre

2

Tout d'abord, vous essayez de déréférencer un pointeur NULL:

int * Character::char_count = 0; 

Les deux constructeurs de class Character font

this->char_id = *char_count; 

et qui est une tentative de déréférencer un pointeur NULL. Ce Code fait aucun sens pour moi, je suppose que vous pouvez simplement utiliser int au lieu de pointer:

int Character::char_count = 0; 
//then 
this->char_id = char_count; 

également ici:

Character * holland = new Character("Holland", HUMAN, MALE); 

vous créez un objet de type class Character. Vous devez supprimer cet objet via un pointeur sur class Character - le pointeur doit avoir le type Character*. Au lieu de cela, vous essayez d'utiliser delete sur un pointeur de type Character** et cela conduit à un comportement indéfini.

Ainsi, au lieu de

delete &holland; 

vous devez utiliser

delete holland; 
+0

Reconstruit avec le repère. Malheureusement, la même chose se passe encore :(.) D'autres suggestions – zeboidlund

+0

@Holland: Cela aurait dû régler le problème initial.Peut-être qu'il y a quelque chose avec la façon dont la classe 'Character' est implémentée. Vous ne nous l'avez pas montré. – sharptooth

+0

Mis à jour pour plus de clarté. Merci. – zeboidlund

4
delete &holland; 

devrait être

delete holland; 

jurons moins serait apprécié. D'autre part, la publication d'un court exemple illustrant succinctement le problème est très appréciée.

+0

LOL, je suis peut-être un prude mais je ne suis pas un censeur! – john

Questions connexes