Brisanje pokazivaca iz Free Store

Brisanje pokazivaca iz Free Store

offline
  • C# and PHP Developer
  • Pridružio: 16 Feb 2011
  • Poruke: 1630
  • Gde živiš: Pancevo

Pazi ovaj problem, sada ja neznam dali je to do racunara ali na lap topu program nastavi sa izvrsavanjem dok na desktop racunaru obori mi program prilikom oslobadjanja memorije cija se adresa cuva u pokazivacu.

Test.exe has stopped working

Evo jedan grub primer koji radi na laptopu a na desktop ne:

#include <iostream> #include <stdlib.h> using namespace std; typedef unsigned int USHORT; int main() {     int myVar = 10;     int *pointer = new int(); // Alociranje memorije na FS za int     // Proveri dali je pokazivac Null     if(pointer != NULL) {         pointer = &myVar;         std::cout << "Vrednost = \t" << *pointer << "\n";         std::cout << "Adresa = \t" << pointer << "\n";     }     else {         std::cout << "Nema dovoljno memorije. Memorija ogranicen resurs \n";         return EXIT_FAILURE;     }     delete pointer;     pointer = 0;     return 0; }

Sad mozda je pokazivac izgubljen.
Kada pozivam delete za pokazivac, oslobadjam memoriju na koju on pokazuje. Pozivanje delete ponovo za taj pokazivac ce oboriti moj program. U ovom slucaju ja nisam ponovo pozivao ali program staje. Sledece kao sto je preporuceno da kada obrisem pokazivac treba ga postaviti na NULL. Kao sto vidite to je i uradjeno samo negde je problem sa memorijom onda.

Sledeca stvar gde isto program pada je sa klasama:

class Cat { public:      Cat();     ~Cat();     int getAge() const { return *itsAge; }     void setAge(int age) { *itsAge = age; }     int getWeight() const { return *itsWeight ;}     void setWeight(int weight) { *itsWeight = weight; } private:     int *itsAge;     int *itsWeight; }; // Konstruktor inicializuje pokazivace na memoriju // slobodnog skladisata  i na podrazumevane // vrednosti Cat::Cat() {     itsAge = new int(2);     itsWeight = new int(5); } // Destruktor // Cisti alociranu memoriju, posto je ovo destruktor // nema potrebe dodeljivati null vrednost pokazivacima // jer oni nece vise biti pristupacni Cat::~Cat() {     delete itsAge;     delete itsWeight; } // test int main() {     Cat *Garfild = new Cat;     Garfild->setAge(10);       // or (*Garfild).setAge(10)     Garfild->setWeight(14);  // or (*Garfild).setWeight(14)             delete Garfild;         return EXIT_SUCCESS; }

Na kraju krajeva mislim da ovi pokazivaci postaju izgubljeni a program pokusava da nadje tu vrednost i kad vidi da je nema on puca. Jel ima neko pametnije resenje sto se tice ovoga?
Ziveli



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Cudi me da dosad niko nije odgovorio.

Sta se dogodilo:
int myVar = 10; // ovo je na steku int *pointer = new int(); // pokazivac pokazuje na memoriju na hipu


onda si rekao pokazivacu da pokazuje na memoriju na steku:
pointer = &myVar;


tako da si izgubio vezu sa blokom memorije na hipu i napravio si "memory leak".

A ovo onda dovodi do katastrofe:
delete pointer;     pointer = 0;
pokusavas da oslobodis memoriju koja je na steku.

Ne treba ti new (novi blok memorije) ako ce pokazivac da pokazuje na postojecu promenljivu.
int myVar = 10; int* ptr = &myVar;



offline
  • C# and PHP Developer
  • Pridružio: 16 Feb 2011
  • Poruke: 1630
  • Gde živiš: Pancevo

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 }

Ko je trenutno na forumu
 

Ukupno su 834 korisnika na forumu :: 3 registrovanih, 1 sakriven i 830 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Bokiboks, MilosKop, Shilok