2010-02-13 9 views
1

S'il vous plaît voir cette image de l'accident après avoir choisi de déboguer dans MVS2010: http://i48.tinypic.com/dr8q9u.jpgécriture à un pointeur de classe me donne une erreur de violation d'accès

est ici l'en-tête Game.h qui montre la structure de classe de jeu, et Dans l'image, vous verrez la méthode incriminée qui provoque la violation d'accès (setBot(botInfo * b)).

class botInfo; // Forward declaration 

class Game { 
int gameState; 
int flagDropTime; 
botInfo * bot; 
public: 
Game(); 
~Game(void); 
void startGame(); 
void gameOver(int victoriousTeam); 
void resetBall(); 
void hideBall(); 
int getState(); 

void setBot(botInfo * bot); 
botInfo * getBot(); 
}; 

d'une instance de botInfo (autre classe) J'appelle une fonction avec ce code, (jeu _dsbTrench est une variable membre de l'instance botInfo).

botInfo * botPointer = this; 
_dsbTrench->setBot(botPointer); 

Le problème est, chaque fois que j'appelle cela, il fait une exception: exception non gérée à 0x72332569 (PubBot.dll) en MERVBot.exe: 0xC0000005: violation d'accès emplacement d'écriture 0xcdcdcdd5.

Alors, quelle est la cause de cette erreur? Et comment puis-je le réparer?

Merci.

Répondre

0

Je ne pense pas qu'il y ait assez d'informations pour que je puisse vous aider. Mais je vais essayer.

Vous écrivez dans la mémoire qui n'est pas affectée à votre programme par le système d'exploitation - vous devez allouer de la mémoire avant d'y écrire.

  1. Vous ne devez pas passer ce paramètre à d'autres fonctions - vos calculs de décalage sont probablement désactivés - ne pouvez-vous pas utiliser une référence? .
  2. Avez-vous alloué de la mémoire pour dsbtrench?

- modifier -

Comme mentionné par les autres réponses "0xCDCDCDCD" est une variable sentinelle utilisée pour les mots non initialisées.

+0

Je n'ai pas alloué la mémoire pour _dsbTrench, je viens déclarai à l'aide du jeu _dsbTrench. Je suis nouveau en C++ et classes en C++, mais je pensais que je une fois que je déclare la classe son constructeur est automatiquement appelé? – Weasal

+0

si la déclaration ne fournit aucun argument, son constructeur par défaut est automatiquement appelé, oui. A condition qu'il n'y ait pas de constructeurs - ou s'il y a des constructeurs, c'est soit un constructeur par défaut spécifié par vous, soit un défaut plus d'autres. –

+0

Oui, ça a réglé le problème. J'ai déclaré _dsbTrench = new Game(); avant d'utiliser _dsbTrench-> setBot() et cela a fonctionné. Merci – Weasal

0

avez-vous débogué ce code? il semble que _dsbTrench soit nul quand vous appelez la méthode setBot pour cela. le passage de ce pointeur est correct tant que vous savez ce que vous en faites :)

+0

_dsbTrench n'est pas NULL, c'est 0xCDCDCDCD. –

+0

et c'est une raison pour -1 ma réponse? sheeesh ... – grapkulec

2

0xCDCDCDCD est une valeur de drapeau que le runtime MS C utilise pour remplir la mémoire nouvellement allouée. Dans votre "_dsbTrench-> setBot (botPointer);", _dsbTrench est 0xCDCDCDCD - ce qui est évidemment un pointeur bidon. Les chances sont que vous avez oublié d'initialiser cette variable.

+0

+1 Et enlever ma réponse car c'est une copie (et la tienne est une meilleure réponse que la mienne) – zebrabox

Questions connexes