Domanda

A quanto pare questa funzione in SDL_mixer continua a morire, e non sono sicuro del perché. Qualcuno ha qualche idea? Secondo Visual Studio, l'incidente è causato da Windows innescando un punto di interruzione da qualche parte nella linea di realloc ().

Il codice in questione è dalla versione SVN di SDL_mixer specificamente, se questo fa la differenza.

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; 
} 

sto usando Visual Studio 2008, e music_decoders e num_decoders siamo entrambi corretti (music_decoders contiene un puntatore, alla stringa "WAVE" e music_decoders. PTR è 0x00000000, e il meglio che posso dire, l'incidente sembra essere nella funzione realloc (). qualcuno ha qualche idea di come avrei potuto gestire questo problema di crash? non mi dispiace dover fare un po 'di refactoring per fare questo lavoro, se si tratta di questo.

È stato utile?

Soluzione

Per prima cosa, non è valida per allocare un array di puntatori num_decoders, e poi scrivere per indicizzare num_decoders in tale matrice. Presumibilmente la prima volta che questa funzione è stato chiamato, è allocata 0 byte e scrive un puntatore al risultato. Questo avrebbe potuto corrotto le strutture del allocatore di memoria, con un conseguente crash / punto di interruzione quando realloc viene chiamato.

A proposito, se si segnala il bug, si noti che add_chunk_decoder (in mixer.c) è rotto nello stesso modo.

Mi piacerebbe sostituire

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

con

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

Altri suggerimenti

Assicurarsi che il file SDL_Mixer.DLL e la vostra costruzione del programma stanno usando le stesse impostazioni di Runtime C. È possibile che la memoria è allocata mediante un CRT, e realloc'ed utilizzando un altro CRT.

Nelle impostazioni di progetto, cercare C / C ++ -> Generazione di codice. L'impostazione Runtime Library ci dovrebbe essere lo stesso per entrambi.

music_decoders [num_decoders ++] = decodificatore;

Sei una tantum qui. Se num_decoders è la dimensione della matrice poi l'ultimo indice è num_decoders - 1. Pertanto è necessario sostituire la linea con:

music_decoders [num_decoders-1] = decodificatore;

E si consiglia di incrementare num_decoders all'inizio della funzione, non alla fine dal momento che si desidera retrocedere per la nuova dimensione, non per quella vecchia.

Una cosa in più:. Volete moltiplicare le dimensioni con sizeof (const char *), non con doppia stella

Ah, le gioie di programmazione C. Un incidente in realloc (o malloc o libero) può essere attivato da scrivere oltre i limiti di un blocco di memoria - e questo può avvenire in qualsiasi altra parte del programma. L'approccio che ho usato in passato è certo sapore di debug malloc pacchetto . Prima di saltare in con una soluzione di terze parti, controllare la documentazione per vedere se Visual Studio fornisce nulla in questo senso.

Si blocca in genere non sono innescati da punti di interruzione. Stai schiantarsi, rompendo a causa di un punto di interruzione o crash durante la gestione del punto di rottura?

La finestra di output di debug dovrebbe avere alcune informazioni sul motivo per cui un punto di interruzione CRT è stato colpito. Ad esempio, si potrebbe notare durante le operazioni di memoria che i byte di guardia tutto il blocco originale sono stati modificati (a causa di un sovraccarico del buffer che si è verificato prima add_music_decoder stato ancora richiamato). Il CRT controllerà queste pagine di guardia quando la memoria viene liberata e, eventualmente, quando realloced troppo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top