Napisano: 07 Avg 2014 15:24
Ajde da analiziramo red po red moj kod. Moj pogled na ovaj problem izgleda ovako:
Prva linija koda je deklaracije celobrojne promenljive myVar. Ona je na steku i ima neku svoju adresu 38900212 recimo.
int myVar = 10;
Sledeca linija koda je kreiiranje pokazivaca koji ce da sadrzi adresu promenljive koju sam iznad pomenuo.
int *pointer = new int();
myVar se vec nalazi na steku kao sto si i ti sam rekao a i ja vidim.
Razlog zasto sam uradio new int() na pokazivac je jer sam hteo da tu vrednost prebacim a steka u FREE STORE.
Lokalne promenljive su na steku, zajedno sa parametrima funkcija. Kod se nalazi u protoru za kod, a globalne promenljive u prostoru globalnih imena.
Razlog zasto sam stavio promenljivu u Free Store je u tome sto lokalne promenljive nisu trajne. Po povratku iz funkcije one se odbacuju. Zato stavljanje podataka u Free Store resava ovaj problem. Free Store se ne cisti dok se program ne zavrsi.
Memoriju na slobodnm skladistu sam alocirao sa new. A povratna vrednost je memoriska adresa
Gore imam celobrojnu promenljivu i imam pokazivac koji je alocirao memoriju na slobodnom skladistu.
Zatim sam uradio sledece:
if (pointer != NULL) {
pointer = &myVar;
std::cout << "Vrednost = \t" << *pointer << "\n";
std::cout << "Adresa = \t" << pointer << "\n";
}
Ispitivanje dali je pointer promenljiva razlicita od NULL ili ako je pointer == NULL.
Ako new nemoze da kreira memoriju na slobodnom skladistu onda je memmorija ogranicen resurs. Takodje vraca NULL pokazivac. Zato je dobra praksa uvek proveriti dali je pokazivac null kada zahtevamo novu memoriju.
Unutar bloka se nalazi :
pointer = &myVar;
Milim da sam ovde pogresio
Sada kada bolje pogledam ja sam umesto dodeljivanja vrednosti na free store, slobodom skladistu dodao adresu promenljive sa steka gde se ona nalazi.
Mislim da sam trebao da uradim pointer = myVar ali opet grubo gledano bez testiranja mislim da ce opet isto da radi sa greskom.
Gledam ove tvoje crteze kontam ja to ali nekako mi se sve pomesa u glavi..
Elem sledece brisanje ili vracanje memorije slobodnom skladistu. Po povratku iz funkcije pokazivac izlazi iz opsega i postaje izgubljen. Memorija alocirana sa new se ne oslobadja automacki, ona postaje neraspoloziva (pukotina)..
Ovaj problem koji ja imam se izaziva pozivanjem delete ponovo za dati pokazivac obara program.
Alii opet me buni jedna stvar da laptopu radi a na desktopu obara program. Evo vec danima pokusavam da udjem do same srzi to sa alociranjem memorije i pokazivacima i ovaj deo mi bas nesto stvara konfuziju u glavi nemogu da ga skontam detaljno. Ono sto sam ja naucio iz knjiga i googla obara moj program...
Hvala ti na odgovoru i utrosenom vremenu za slike... Imas pivo od mene
Dopuna: 07 Avg 2014 15:34
JBT upravu si covek.. Sad sam video sta sam uradio izgubljena veza memory leak.... Sad sam pokusao nekoliko primera i stavio sve na papir i onda sam tek na papiru video gde puca...
Sad sam pokusao sam da izazovem par memory leak-ova:
int main() {
// OK
int * p = new int;
delete p;
// Memory leak
int * q = new int;
// no delete
}
|