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?
Mød TrackMan og Veo på Computerworld Cloud & AI Festival og hør, hvordan tech ændrer måden, vi træner og udvikler talent – fra skolebold til The Masters.
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.
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.
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
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.
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.
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.
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.