Avatar billede jacob_top Nybegynder
16. januar 2005 - 14:07 Der er 13 kommentarer

Memory management

Hej Alle!!

Jeg har lige nogen hurtige spørgsmål mht til memory management i c++:

1: Skal midlertidige variabler som integers og std:string's, chars osv. frigives fra memory når de går "out of scope"? Altså hvis jeg opretter en string i en metode, som er midlertidig, skal jeg så selv sørge for at slette denne streng i slutningen af min metode eller? Og hvad med simple variable?

2: Hvilke members i en klasse skal destrueres i en destructor?
Skal integers og ander simple variable "deletes"? Eller er du kun arrays osv.

3: I min klasse har jeg kun en member, som er std::vector.
Når denne skal destrueres, ligger der en destruktor i vector klassen. Men hvad nu, hvis vectoren indeholder andre objekter?
Destruerer vectorens destructor også disse eller skal de enkelte objekter destrueres individuelt?

Det var vist alt for nu!

Mvh, og på forhånd tak.
Jacob
Avatar billede bromer Nybegynder
16. januar 2005 - 14:12 #1
Når du opretter et nyt scope - for eksempel ved funktionskald - vil variabler etc i dette scope blive gemt i en stakramme. Når du går ud af dette scope vil strakrammen blive fjernet igen. Stakrammerne ligger i en hop, som du ikke skal bekymre dig om.

Du skal tænke på de ting du opretter med "new" (og de ting du allokerer hukommelse til med *alloc). Du skal deallokere eller destruere inden du mister referencen til dine objekter.
Avatar billede bromer Nybegynder
16. januar 2005 - 14:15 #2
Jeg kan se at jeg glemte at svare på noget. Hvis std::vector er implementeret ordentligt vil den sørge for ikke at efterlade noget hul i hukommelsen efter dens desctructor er blevet kørt, så hvis du bare sørger for at køre den bør der ikke være nogle problemer.

Rune
Avatar billede driis Nybegynder
16. januar 2005 - 14:22 #3
Til std::vector : Destructor på objekter der ligger i din vector bliver kaldt automatisk når vector'ens destructor kaldes - men hvis du laver en vector der indeholder pointere til objekter, bliver disse objekters destructor _ikke_ kaldt. Altså vil f.eks. følgende give en memory leak:
{
std::vector<my_type*> v;
for (int i = 0; i < N; ++i)
    v.insert(new my_type(i));
...
} // v is destroyed here
Avatar billede bromer Nybegynder
16. januar 2005 - 14:25 #4
Men det vil heller ikke være en ordentlig implementation af std::vector. Man må antage at de ting man bruger er implementeret ordentligt. Under alle omstændigheder ville det være noget der skal rettes i std::vector implementation.
Avatar billede jacob_top Nybegynder
16. januar 2005 - 14:39 #5
Hmm, ok tak!

Min vector indeholder objekter af typen Led. Led objekter indeholder 3 integers og 2 booleans.

Et Led bliver lagt over i vektoren med:

enVector.push_back(Led etLed(3, 5));

Jeg går ud fra at vektoren ved at gøre det på denne måde indeholder referencer til ledene?

Skal der skrives en destructor til led klassen? Og bliver denne kaldt når programmet afsluttes?
Avatar billede bromer Nybegynder
16. januar 2005 - 14:46 #6
Hvis du opretter dine Led objekter og derefter tilføjer dem til din vektor, som en reference vil Vectors destructor ikke tage sig af dem.

Du kan godt skrive en destructor, men jeg kan ikke se at den skal bruges til noget. Din garbagecollector vil selv finde og cleare den hukommelse dine Led objekter har taget.

Når dit program bliver afsluttet bliver alt hukommelse clearet. Jeg mener ikke at kende til systemer, hvor objekternes destrutorer bliver brugt.

Rune
Avatar billede arne_v Ekspert
16. januar 2005 - 17:36 #7
re 1)

Alt det der er lavet new på skal der også laves delete på.

X x();

skal ikke deletes.

X *x = new X();

skal deletes.

re 2)

Som følge af #1 gælder det at du i en destructor skal delete alt det der er new'et
i constructor eller andre metoder, men ikke andet.

re 3)

Igen.

Hvis det som ligger i din vector er new'et så skal du selv delete det.

Hvis det ikke er new'et, s¨behøver du ikke delete det.
Avatar billede arne_v Ekspert
16. januar 2005 - 17:38 #8
bromer>

garbage collector ?

(std::string antyder ikke ligefrem managed C++)
Avatar billede bromer Nybegynder
16. januar 2005 - 18:08 #9
arne_v> Det var mig der tænkte på noget andet, mens jeg skrev. Det jeg mente havde ikke noget med en garbage collector at gøre. Jeg mente bare at variabler såsom integers etc der ikke bliver specifikt allokeret men bare lagt på stakken ikke skal deallokeres idet de bliver fjernet fra lagetet når den tilhørende stak-ramme bliver fjernet.

Rune
Avatar billede arne_v Ekspert
16. januar 2005 - 18:10 #10
OK - så forstår jeg
Avatar billede jacob_top Nybegynder
16. januar 2005 - 19:28 #11
Jeg bruger ikke new operatoren nogen steder.... vil det sige at jeg ikke behøver nogen destructor?

note: Jeg tror ikke selv det er nødvendigt
Avatar billede arne_v Ekspert
16. januar 2005 - 19:37 #12
Hvis du bruger malloc skal du kalde free (ligesom med new og delete).

Hvis du ikke allokerer dynamisk memory kan det meget vel tænkes at du ikke har
brug for destructor'er.

Men der kan dog også være andre grunde end memory deallokering for at have
en destructor.
Avatar billede arne_v Ekspert
25. februar 2005 - 22:19 #13
Tid at få afsluttet her ?

Og et svar fra mig

Husk og bed andre om at ligge svar
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis