Avatar billede spectual Nybegynder
21. juli 2001 - 14:56 Der er 10 kommentarer og
1 løsning

Deallkokering af hukommelse

Hvis man nu har en pointer til en structure/class, hvis hukommelse man har allokeret med malloc - hvordan frigører man så hukommelsen?

F.eks.:

#include <stdio.h>
#include <stdlib.h>

struct test {
    char navn [50];
};

void main () {

    test *ptr;

if ((ptr = (struct test *)malloc(sizeof(struct test))) == NULL)
    { printf (\"Aber nein.\\n\");return; }

// deallokering her

}
Avatar billede erikjacobsen Ekspert
21. juli 2001 - 16:37 #1
free(ptr);
Avatar billede spectual Nybegynder
21. juli 2001 - 16:42 #2
Hvis det var rigtigt, burde jeg så ikke få en Access Violation når jeg efter free (ptr) strcpy\'er noget ind i ptr->navn ?
Avatar billede erikjacobsen Ekspert
21. juli 2001 - 16:54 #3
Nej, området den pegede på er \"frigivet\" til andet brug, men ikke taget i brug -
sandsynligvis, og det vil aldrig give fejl at skrive i et område i lageret indenfor
din process. Jeg kan ikke huske om ptr bliver NULLet efter brug, men det tror jeg
nu ikke. Kører dit program længe, vil du derimod få mystiske \"logiske\" fejl.

Det er præcis den svaghed i C/C++ som man har forsøgt at løse i Java, ved at
lave det pointer-løst.
Avatar billede spectual Nybegynder
21. juli 2001 - 17:00 #4
Men man vil undgå de der \"logiske\" fejl (hvad det så end er) hvis man altid sørger for at allokere og deallokere efter behov?
Avatar billede spectual Nybegynder
21. juli 2001 - 17:02 #5
Teoritisk set må man kunne helt udelade at de-allokere, men i så fald vil der opstå memory leaks. I mit tilfælde vil det være ligegyldigt om der står memory leaks fordi det er relativt sjældent at jeg får brug for at deallokere.
Avatar billede erikjacobsen Ekspert
21. juli 2001 - 17:20 #6
Du skal \"bare\" sørge for at vide hvad der er i dine pointere, og ikke bruge
en \"dangling reference\", altså f.eks. skrive i et netop frigivet område. Man bør
programmere pænt, for at opnå dette. Eller selvfølgelig bare lade være med at
deallokere - kører programmet ikke særligt længe med små data, er det endda
sikkert en anelse hurtigere :=)
Avatar billede erikjacobsen Ekspert
21. juli 2001 - 18:06 #7
Mange tak. Jeg kan fortælle dig at der er værktøjer til at checke om man
gør det ordentligt - jeg kender ikke lige nogen på stående fod. I gamle dage,
da jeg var med til et større projekt i C, lavede vi nogle makroer til malloc og free,
der skrev på en logfil. Her kom adressen i lageret til at stå, og efterfølgende kunne
man så - med et lille Perl-program - løbe igennem og se om man manglede at frigive
noget, eller andre ting der var galt. Vores mål, at alt blev ryddet op, perfekt,
lykkedes jo så til sidst. I produktionsversionen blev disse tests fjernet, men kunne
sættes ind igen med en ændring på én linie. Ja, se det var tider ...:)
Avatar billede spectual Nybegynder
21. juli 2001 - 18:41 #8
ja, den metode har jeg set før brugt i hovedprogrammet af det jeg laver.

Praktisk :)
Avatar billede spectual Nybegynder
21. juli 2001 - 18:43 #9
Jeg var faktisk ikke klar over at du kunne C :-)
Avatar billede jpk Nybegynder
24. juli 2001 - 09:36 #10
Programmet Bounds Checker fra NuMega kan håndtere stort set al form for memory check...

=>erikjacobsen
Du skriver i et indlæg:
\"og det vil aldrig give fejl at skrive i et område i lageret indenfor din process.\"
Er det hvad der sker med malloc? I C++, allokeres hukommelse med \'new\' jo på heap\'en.
Avatar billede erikjacobsen Ekspert
24. juli 2001 - 10:03 #11
Det er det samme med malloc. Den er mere \"primitiv\", da man selv skal
be\' om den rigtige størrelse - men hvad, så har man jo styr på det.
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