2016-01-09 3 views
-2

Je crée une application en utilisant SDL 2. J'ai récemment commencé à utiliser la bibliothèque SDL_Mixer et cela a provoqué un problème pour moi. Pardonnez-moi si mon explication semble vague, car ce bug est extrêmement confus.Mon programme se bloque parfois lorsque la suppression est appelée sur un pointeur particulier

Parfois, lors de la fermeture de mon programme, le programme se bloque. Seulement parfois cela arrive. Après avoir enlevé des parties de code, j'ai trouvé que la ligne provoquant ceci était un simple delete appel sur un pointeur de type Window*. Si je supprime cet appel de suppression, plus de blocage se produit lorsque je ferme le programme. Une autre chose qui est importante à noter est que le crash se produit juste après que delete soit appelé, ce qui signifie que le programme ne va même pas à l'intérieur de ~Window() ce qui est vraiment étrange.

Autre chose que j'ai remarquée, c'est que lorsque je supprime l'appel Mix_OpenAudio(...) depuis le début du programme, aucun incident ne se produit, que l'appel de suppression soit ou non présent. L'initialisation de SDL_Mixer a donc quelque chose à voir avec les plantages, mais cela ajoute juste plus de confusion. J'espère que quelqu'un a une idée de ce qui pourrait être le problème ici, mais si mon explication est trop vague alors je vais essayer de reproduire le problème dans un segment de code assez petit que je peux poster ici. Je ne voulais pas copier mon code entier sur cette question car je ne veux pas que les mods me détestent. Des idées?

Répondre

0

Sans voir le code en question, voici ma deviner les deux causes les plus probables:

  1. Votre pointeur de fenêtre * est non initialisée ou des points à une adresse mémoire illégitime.
  2. La fenêtre référencée via ce pointeur a déjà été supprimée, et vous vous effondrez en essayant de la supprimer une seconde fois. Cela a tendance à planter avant que vous n'entriez dans le destructeur, car ce que Windows * pointe vers n'est plus une mémoire valide et n'a pas de vtable avec le pointeur vers le destructeur.
0

Ceci est la plupart du temps un exemple de undefined behavior qui est une condition particulière qui, lorsqu'il est atteint, n'a pas de garanties précises sur ce qui se passera.

La suppression d'un pointeur invalide est en effet un comportement indéfini. Maintenant, le problème est que vous devez comprendre pourquoi et quand le pointeur vers Window devient invalide, quelques conseils:

    pointeur
  • est non initialisée
  • pointeur
  • a déjà été supprimé pointeur
  • est le résultat d'une autre opération qui apporte comportement indéfini (comme le déréférencement d'un membre d'un pointeur invalide)
  • Le pointeur était stocké dans une variable locale/pile qui n'est plus valide lorsque vous appelez delete (donc vous n'essayez pas de supprimer le pointeur correct, par exemple renvoyer une référence à un pointeur stocké dans une variable locale à partir d'une méthode)
0

Je devais tester avant de répondre à votre question, mais j'ai l'impression que ma mémoire était correcte: Si vous appelez la suppression plusieurs fois sur un pointeur, votre programme va planter. Donc, je pense que le pointeur que vous supprimez a déjà été supprimé.

Voici mon test: Running a simple test with g++

J'ai essayé la mise en p null après la suppression, et qui a fait ce qui suit si réussir. Mais si j'ai commenté la partie qui met p à null, le si p traité comme vrai, et le programme s'est écrasé.

enter image description here

Vous avez besoin d'un moyen de tester et de voir si le pointeur est nul ou non avant de le supprimer. Malheureusement, je ne sais pas comment tester un pointeur pour voir s'il pointe vers des données valides. Je pensais qu'un simple "if (pointeur)" fonctionnerait, mais comme vous pouvez le voir sur ma dernière image, ce n'est pas le cas.