Question

Apparemment, cette fonction SDL_mixer cesse de flancher, et je ne sais pas pourquoi. Quelqu'un a-t-il une idée? Selon le studio visuel, l'accident est causé par Windows le déclenchement d'un point d'arrêt quelque part dans la ligne realloc ().

Le code en question est de la version SVN de SDL_mixer spécifiquement, si cela fait une différence.

static void add_music_decoder(const char *decoder) 
{ 
  void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **)); 
  if (ptr == NULL) { 
    return; /* oh well, go on without it. */ 
  } 
  music_decoders = (const char **) ptr; 
  music_decoders[num_decoders++] = decoder; 
} 

J'utilise Visual Studio 2008, et music_decoders et num_decoders sont tous les deux corrects (music_decoders contient un pointeur, à la chaîne « vague » et music_decoders. Ptr est 0x00000000, et le meilleur que je peux dire, l'accident semble être dans la fonction realloc (). est-ce que quelqu'un a une idée comment je pourrais gérer ce problème de l'accident? Je ne me dérange pas d'avoir à faire un peu de refactoring pour faire ce travail, si elle se résume à cela.

Était-ce utile?

La solution

Pour une chose, ce n'est pas valide d'allouer un tableau de pointeurs de num_decoders, puis écrire à num_decoders index dans ce tableau. On peut supposer que la première fois cette fonction a été appelée, il a alloué 0 octets et a écrit un pointeur sur le résultat. Cela aurait pu corrompre les structures de la mémoire allocateur, ce qui entraîne dans un accident / quand realloc est breakpoint appelé.

BTW, si vous signalez le bug, notez que add_chunk_decoder (en mixer.c) est brisée de la même manière.

Je REMPLACER

void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **));

avec

void *ptr = realloc(music_decoders, (num_decoders + 1) * sizeof(*music_decoders)); 

Autres conseils

Assurez-vous que le fichier SDL_Mixer.DLL et votre programme de construction utilisent les mêmes paramètres C Runtime. Il est possible que la mémoire est allouée à l'aide d'un tube cathodique, et en utilisant un autre realloc'ed CRT.

Dans les paramètres du projet, recherchez C / C ++ -> Génération de code. Le paramètre Runtime Library, il doit être le même pour les deux.

music_decoders [num_decoders ++] = décodeur;

Vous êtes ici hors. Si num_decoders est la taille du tableau, alors le dernier indice est num_decoders - 1. Par conséquent, vous devez remplacer la ligne avec:

music_decoders [num_decoders-1] = décodeur;

Et vous pouvez augmenter num_decoders au début de la fonction, pas à la fin puisque vous voulez reallow pour la nouvelle taille, pas pour l'ancien.

Une chose supplémentaire:. Vous voulez multiplier la taille avec sizeof (const char *), pas avec double étoiles

Ah, les joies de la programmation C. Un accident dans realloc (ou malloc ou libre) peut être déclenchée par écrit au-delà des limites d'un bloc de mémoire - et cela peut se produire nulle part ailleurs dans votre programme. L'approche que je l'ai utilisé dans le passé est un peu de saveur du paquet débogage malloc . Avant de sauter avec une solution tierce, consultez la documentation pour voir si Visual Studio fournit tout le long de ces lignes.

Crashes ne sont pas déclenchées généralement par des points d'arrêt. Êtes-vous s'écraser, briser en raison d'un point d'arrêt ou plantage lors de la manipulation du point d'arrêt?

La fenêtre de sortie de débogage devrait avoir des informations pour lesquelles un point d'arrêt CRT est frappé. Par exemple, il peut remarquer au cours des opérations de mémoire que les octets de garde autour du bloc d'origine ont été modifiés (en raison d'un dépassement de mémoire tampon qui a eu lieu avant add_music_decoder a même été invoquée). Le CRT vérifiera ces pages de garde lorsque la mémoire est libérée et peut-être quand realloced aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top