c + + - reallok krascher i tidligere stabile funktion

Indlæg af Hanne Mølgaard Plasc

Problem



Tilsyneladende holder denne funktion i SDL\_Mixer døende, og jeg er ikke sikker på hvorfor. Har nogen nogen ideer? Ifølge den visuelle studio er krasj forårsaget af Windows, der udløser et breakpoint et eller andet sted i realloc () -linjen.


Koden i spørgsmålet er specifikt fra SVN-versionen af ​​SDL\_Mixer, hvis det gør en forskel.


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


Jeg bruger Visual Studio 2008, og music\_decoders og num\_decoders er begge rigtige (music\_decoders indeholder en pointer til strengen 'WAVE' og music\_decoders. Ptr er 0x00000000, og det bedste jeg kan fortælle synes at være crash i reallok () funktion. Har nogen nogen anelse om, hvordan jeg kunne klare dette crash problem? Jeg er ikke sikker på at skulle lave en smule refactoring for at gøre dette arbejde, hvis det kommer ned til det.

Bedste reference


For en ting er det ikke gyldigt at allokere en række num\_decoders pointers, og skriv derefter til indeks num\_decoders i det array. Formentlig den første gang denne funktion blev kaldt, tildelte den 0 byte og skrev en pointer til resultatet. Dette kunne have ødelagt hukommelsesallokatorens strukturer, hvilket resulterer i et nedbrud/brudpunkt, når realloc hedder.


Btw, hvis du rapporterer fejlen, bemærk at add\_chunk\_decoder (i mixer.c) er brudt på samme måde.


Jeg erstatter


void *ptr = realloc(music\_decoders, num\_decoders * sizeof (const char **));


med


void *ptr = realloc(music\_decoders, (num\_decoders + 1) * sizeof(*music\_decoders)); 

Andre referencer 1


Sørg for, at SDL\_Mixer.DLL-filen og dit programbygning bruger de samme C Runtime-indstillinger. Det er muligt, at hukommelsen er allokeret ved hjælp af en CRT, og genfordeles ved hjælp af en anden CRT.


I projektindstillingerne skal du kigge efter C/C ++ -> Code Generation. Runtime Library-indstillingen der skal være det samme for begge.

Andre referencer 2


music\_decoders [[num\_decoders ++]]=dekoder;


Du er engang her. Hvis num\_decoders er størrelsen på arrayet, er det sidste indeks num\_decoders - 1. Derfor skal du erstatte linjen med:


music\_decoders [[num\_decoders-1]]=dekoder;


Og du vil muligvis øge num\_decoders i begyndelsen af ​​funktionen, ikke i slutningen, da du vil genopdele til den nye størrelse, ikke for den gamle.


En ekstra ting: du vil formere størrelsen med sizeof (const char *), ikke med dobbel stjerne.

Andre referencer 3


Åh, glæden ved C-programmering. Et crash i realloc (eller malloc eller gratis) kan udløses ved at skrive forbi grænserne for en hukommelsesblok - og det kan ske andre steder i dit program. Den fremgangsmåde jeg tidligere har brugt er en del af fejlfinding malloc-pakken. Før du hopper ind med en tredjepartsløsning, skal du tjekke docs for at se, om Visual Studio giver noget i henhold til disse linjer. [8]

Andre referencer 4


Krasj er normalt ikke udløst af breakpoints. Kolliderer du, bryder på grund af et brudpunkt eller styrter under håndtering af breakpoint?


Fejlfindingens udgangsvindue skal have nogle oplysninger om, hvorfor et CRT-pausepunkt bliver ramt. Det kan for eksempel bemærke under hukommelsesoperationerne, at beskyttelsesbytes omkring den oprindelige blok er blevet ændret (på grund af et bufferoverskridelse, der opstod, før add\_music\_decoder blev til og med påberåbt). CRT'en kontrollerer disse beskyttelsessider, når hukommelsen frigøres og muligvis, når den omfordeles.