2010-02-09 4 views
1

J'ai créé une classe qui prend un tas d'images et les superpose sur un BMP. Pour une raison quelconque lors de l'exécution du code, je reçois un segfault et je l'ai suivi jusqu'à cette méthode. Essentiellement, l'instruction if vérifie s'il existe un index valide dans le tableau d'images pour placer cette nouvelle image. Si elle est valide, elle supprime tout ce qui existait auparavant et définit cet index sur cette nouvelle image. La classe s'appelle Scene et comprend un tableau de pointeurs d'image. Donc ce que je fais remplace l'image vers laquelle pointe l'un de ces pointeurs. D'une certaine manière, cela ne fonctionne pas. Si le pointeur est NULL, la commande delete ne devrait causer aucun problème, donc je ne vois pas ce qui pourrait mal se passer. Ce code agit sur une scène qui a un tableau de pointeurs d'image de longueur 5.Erreur de bus lors de l'appel Supprimer (C++)

void Scene::addpicture(const char* FileName, int index, int x, int y) 
{ 
if (index<0 || index>maxnum-1) 
{ 
    cout << "index out of bounds" << endl; 
} 

else 
{ 
     Image* extra; 
     extra = new Image; 
     extra->ReadFromFile(FileName); 

     delete imagelist[index]; 


     imagelist[index] = extra; 
     imagelist[index]->xcoord=x; 
     imagelist[index]->ycoord=y; 
} 
} 

Quelqu'un peut-il aider. Cela serait très appréciable.

Merci

J'ai édité pour inclure le constructeur:

Scene::Scene(int max) 
{ 
Image** imagelist = new Image*[max]; 
for(int i=0; i<max; i++) 
{imagelist[i] = NULL;} 

maxnum = max; 
} 

J'ai également commenté la principale méthode pour que les seules fonctions étant appelées sont

Scene* set = new Scene(5); 
set->addpicture("in_01.bmp", 0, 0, 0); 
+0

pourrait vous s'il vous plaît fixer le retrait de code? –

+0

Quelle ligne plante? –

+1

Vous n'avez pas besoin de vérifier null avant la suppression. Aussi, pourquoi ne pas combiner 'Image * extra' avec la ligne suivante? – GManNickG

Répondre

0

Cette le code a l'air OK, je pense que l'erreur est dans une autre partie du programme. Peut-être que le tableau imagelist n'est pas initialisé à NULL? Ou maxnum n'est pas la taille réelle de imagelist. Ou quelque chose d'autre.

Qu'est-ce qui échoue exactement - avez-vous traceback?

+0

Je suis assez nouveau en C++, mais je l'ai réduit à la commande delete. –

+0

Ensuite, le pointeur n'est pas valide.Vous devrez suivre tout et voir où cela ne va pas. – GManNickG

+0

Je vois deux raisons les plus probables: le tableau n'est pas initialisé (tous les pointeurs du tableau ne sont pas définis sur NULL) ou lorsque l'objet est supprimé (dans une autre partie du programme), le pointeur n'est pas défini sur NULL. – Messa

1

Un SEGFAULT signifie que vous essayez d'accéder à un emplacement en dehors de ce que vous devriez être. Dans votre commentaire à Messa, vous dites que cela se passe à la commande delete.

Alors, je vous demande: Quand vous construisez la classe Scene, vous explicitement les pointeurs dans initialisez imagelist NULL? En d'autres termes, y at-il des lignes comme:

for (i=0; i<maxnum; i++) { 
    imagelist[i] = NULL; 
} 

dans votre constructeur, ou sont en supposant que vous que les tableaux commencent initialisées comme 0-rempli? (Contrairement à la plupart des langages, cette hypothèse est mauvaise en C++.)

+1

Et c'est une raison pour laquelle nous devrions utiliser 'std :: vector' à la place. – GManNickG

+0

Ouais, je viens de télécharger mon constructeur par défaut et il semble juste faire cela. Où d'autre pourrait-il aller mal? J'ai inclus les instructions en cours d'exécution dans la méthode principale ainsi que mon constructeur et la méthode addpicture. –

+1

Savez-vous que vous avez un tableau de tableaux d'images? C'est probablement une erreur, alors essayez 'Image *' au lieu de 'Image **'. Ou bien, allez en C++ et utilisez 'std :: vector'. – Messa

4

Dans votre constructeur, vous disposez d'une liste d'images locale, mais vous utilisez un imageliste de zone dans addpicture. Vous observez le champ imageliste dans le constructeur et le champ ne s'initialise jamais.

Fix en remplaçant cette ligne:

Image** imagelist = new Image*[max]; 

Avec ceci:

imagelist = new Image*[max]; 
Questions connexes