24. januar 2006 - 09:42Der er
10 kommentarer og 1 løsning
Rigtig dealokering?
struct TAbc { int A; double B; short C; };
::
TAbc* Abc = new TAbc[100000];
::
delete [] Abc Abc = NULL;
Men struct er væsentlig større end den i ovenstående eksempel og jeg kan se i 'Windows Task Manager' at new linien tager 30 MB af hukommelsen! Hvorfor 'fjerner' delete [] ikke de 30 MB igen, er der noget galt i ovenstående?
Den frigiver pladsen så dit C++-program kan genbruge det til andre ting, men den frigiver det ikke til det bagvedliggende operativsystem. Hvis den skulle gøre det ved hver delete, ville de kald der skal laves til operativsystemet sløve tingene gevaldigt ned.
Ok tak, giv et svar. Det vidste jeg nu egentlig godt. Men jeg synes ikke det er det der sker idet det også sker 2. (60 MB) og 3. gang (90 MB) der bliver kaldt ned i koden.
Der er tale om (bruger triggede) dll kald fra et Delphi program (via external declaration)! Mon du har en idé!? (-;
Jeg har lige afprøvet dit program, hvor jeg har tjekket Joblisten ved hver getchar():
TAbc* Abc; getchar(); Abc = new TAbc[1000000]; getchar(); delete [] Abc; getchar(); Abc = new TAbc[1000000]; getchar(); delete [] Abc; getchar(); Abc = new TAbc[1000000]; getchar(); delete [] Abc; getchar();
Det virker altså fint nok - den tildelte (virtuelle, idet den jo ikke er taget i brug endnu) hukommelse går fra 23 MB til 192 KB uden problemer hver eneste gang.
Ja delete[] kaldes før 2. og 3. gang. Dit lille eksempel ... jeg har lige prøvet og giver dig ret. Forskellen til det project jeg sidder og retter i er at det aktiveres via et dll kald fra Delphi
Det kan måske forklares med en tegning. Vi lægger lige heapen ned:
Start HEAP1: (tom) Alloker stor klump (30MB): HEAP2: [30MB] Alloker yderligere en lille dims (1KB): HEAP3: [30MB][1KB] Dealloker den store klump HEAP4: (tom 30 MB)[1KB] Nu kan der ikke frigives til OS, da den lille dims blokerere Vi allokere yderligere en lille dims (2KB): HEAP5: [2KB](tom 29.998MB)[2KB] Alloker stor klump (30MB): HEAP5: [2KB](tom 29.998MB)[2KB][30MB] Der er nemlig ikke plads til den i den tomme klump.
Det kan altså have betydning hvad du ellers gør mellem de store allokeringer.
>erikjacobsen Interresant betragtning, den må jeg lige tænke lidt over og undersøge nærmere. 'Den lille dims' er vel en C ting (ikke Delphi) og kan man få hjælp fra C++Builder 4 eller et værktøj til at finde den!!? (-;
>erikjacobsen Giv et svar, det er vel fortjent. Jeg er i fuld gang med at rette memmoryhåndteringen i programmet, om det opindelige problem løses er fortsat uvist men der er ingen tvivl om at det har haltet
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.