c ++ - HeapAlloc fejler uafbrudt

Indlæg af Hanne Mølgaard Plasc

Problem



Vi har en DLL (bygget ved hjælp af VC2005), der gør en vis behandling på vegne af den kaldende ansøgning. Denne behandling kræver lidt hukommelse. DLL'en skaber denne hukommelse via heapAlloc som sådan:


//Allocate space
myStruct* pStackSpace = (myStruct*)::HeapAlloc(m\_hStackHeap, 0, sizeof(myStruct));

...
do some processing here
...

//Free space
::HeapFree(m\_hStackHeap, 0, pStackSpace);


Hejen er tildelt via:


m\_hStackHeap = ::HeapCreate(0, sizeof(myStruct)*10, 0);


Efter oprettelsen tildeler vi faktisk 20 myStructs og frigiver dem bare for at sikre, at det håndterer det. Så vi ved, at der er plads nok.


Problemet er, at HeapAlloc i nogle tilfælde returnerer NULL. Hvis det sker, gør vi en HeapValidate(m\_hStackHeap, 0, NULL), som altid kommer tilbage ingenlunde (hvilket betyder at alt er godt). Så vi ved, at bunken er ok.


Vi tillægger også, at vi aldrig har mere end 10 samtidige tildeling på samme tid, så der skal være nok plads siden den oprindelige heapCreate reserverede så meget.


Det næste opkald til HeapAlloc lykkes ofte. Adfærd er meget sporadisk. Det vil fungere fint, så undlader at tildele et par gange og derefter begynde at fungere fint igen.


Eventuelle ideer om hvad der foregår?

Bedste reference


Opførelsen antyder, at det kunne skyldes heap fragmentering. Du kan have tilstrækkelig samlet bunkeplads til at tilfredsstille anmodningen, men ingen gratis blokke tilstrækkeligt store. Prøv at bruge en Low Fragmentation Heap. Du kan gøre det ved at ringe til HeapSetInformation () for at aktivere LFH. Bemærk at du ikke kan bruge LFH, hvis du har angivet HEAP\_NO\_SERIALIZE flag i HeapCreate ().

Andre referencer 1


I stedet for at bruge en brugerdefineret bunke kan du bruge brugerdefinerede ALLOC og GRATIS rutiner, der holder en pulje af den passende størrelse.


Dette gøres ved at forene strukturen med en simpel objekt, der indeholder en NEXT-peger og en global variabel, der indeholder en pointer.


Hvis du 're out' tildeler en ny fra den globale bunke.


Hvor du ville have ødelagt bunken fri alle disse.

Andre referencer 2


2mb strukturer? Overvej at bruge VirtualAlloc og en alloc/free pointer liste.