Avatar billede f2f4 Novice
24. januar 2006 - 09:42 Der 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?

Tak for svar!
Avatar billede erikjacobsen Ekspert
24. januar 2006 - 09:51 #1
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.
Avatar billede f2f4 Novice
24. januar 2006 - 10:31 #2
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 dog fået udelukket en mulighed nu tak.
Avatar billede nlf Nybegynder
24. januar 2006 - 10:36 #3
Et godt råd: alt, du new'er i DLL, skal også delete's i DLL, og vice versa med dit program. Det er bare, så du undgår dumme fejl i fremtiden ;)

For det andet kalder du vel delete[], før du kalder new 2. og 3. gang?
Det er bare for at være sikker ;)
Avatar billede nlf Nybegynder
24. januar 2006 - 10:44 #4
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.
Avatar billede f2f4 Novice
24. januar 2006 - 11:46 #5
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
Avatar billede nlf Nybegynder
24. januar 2006 - 12:06 #6
Altså du kalder både new og delete fra en DLL?
Avatar billede erikjacobsen Ekspert
24. januar 2006 - 12:07 #7
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.
Avatar billede f2f4 Novice
24. januar 2006 - 12:58 #8
>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!!? (-;
Avatar billede f2f4 Novice
25. januar 2006 - 15:41 #9
>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
Avatar billede erikjacobsen Ekspert
25. januar 2006 - 16:11 #10
Jeg samler slet ikke på point, tak. Og det er selvfølgelig kun en teori for hvorfor du ikke får frigivet plads,
Avatar billede f2f4 Novice
08. februar 2006 - 17:26 #11
Tak for hjælpe!
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester