Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Vracanje objekta iz metode i izvrsavanje destruktora

[es] :: C/C++ programiranje :: Vracanje objekta iz metode i izvrsavanje destruktora

[ Pregleda: 2814 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

miki_ja
Bgd

Član broj: 69771
Poruke: 97
*.dynamic.sbb.rs.



Profil

icon Vracanje objekta iz metode i izvrsavanje destruktora16.04.2009. u 23:45 - pre 181 meseci
Desava mi se jedna cudna situacija, ili je ja barem tako dozivljavam...
Naime, jedna metoda mi vraca objekat neke liste (od vec postojece, bira odredjene elemente).

Code:

Lista Klasa::filtriraj()
{
     Lista lista;
     for (Elm* e = prvi; e; e = e->sled)
     {
          //ovde neka provera
          lista.dodaj(*(e->nesto));
     }
     return lista;
}


Kroz debag, sve izgleda dobro. Dolazi se do 'return', regularno se pravi kopija liste (postoji copy konstruktor), i onda se poziva destruktor koji brise svu dinamicki dodeljenu memoriju u listi, a zatim se iz metode vraca prazna lista??
Kroz debag sam moga da primetim da se destruktor poziva jos jednom, odmah nakon povratka iz metode, sto je ok, ali zasto se poziva pre vracanja rezultata?
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Vracanje objekta iz metode i izvrsavanje destruktora17.04.2009. u 09:01 - pre 181 meseci
Zato sto je 'Lista lista' lokalna promenljiva doticne funkcije, instancionirana na stack-u,
pa po izvrsenju funkcije izlazi iz 'vazenja' (tj. biva unistena, poziva joj se destruktor).

Moras je ili uciniti trajnijom (da bude clanica klase, naprimer) ili alocirati dinamicki pa ostaviti
obavezu funkciji koja poziva filtriraj( ) metodu da je dealocira kad ne bude vise trebala.

Ne bi bilo lose ni da funkcija koja poziva filtriraj( ) metodu sama kreira listu i prosledi njenu adresu
kao ulazni argument (Lista* pLista), tj:

Code:

// negde u funkciji koja poziva filtriraj( ) metodu:
....
Lista lista;
filtriraj(&lista);
...


Odaberi sam sta ti je najbolje resenje prema ostatku programa.
 
Odgovor na temu

miki_ja
Bgd

Član broj: 69771
Poruke: 97
*.dynamic.sbb.rs.



Profil

icon Re: Vracanje objekta iz metode i izvrsavanje destruktora17.04.2009. u 10:14 - pre 181 meseci
Ok, jasno mi je to, nego nisam bas ocekivao da se obrise pre nego sto se vrati kopija.

Uradicu po tvom trecem predlogu, tako ce sigurno raditi... hvala... pozz...
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
91.150.120.*



+9 Profil

icon Re: Vracanje objekta iz metode i izvrsavanje destruktora17.04.2009. u 11:36 - pre 181 meseci
Citat:
milanche: Zato sto je 'Lista lista' lokalna promenljiva doticne funkcije, instancionirana na stack-u,
pa po izvrsenju funkcije izlazi iz 'vazenja' (tj. biva unistena, poziva joj se destruktor).

Moras je ili uciniti trajnijom (da bude clanica klase, naprimer) ili alocirati dinamicki pa ostaviti
obavezu funkciji koja poziva filtriraj( ) metodu da je dealocira kad ne bude vise trebala.

Ne bi bilo lose ni da funkcija koja poziva filtriraj( ) metodu sama kreira listu i prosledi njenu adresu
kao ulazni argument (Lista* pLista), tj:

Code:

// negde u funkciji koja poziva filtriraj( ) metodu:
....
Lista lista;
filtriraj(&lista);
...


Odaberi sam sta ti je najbolje resenje prema ostatku programa.


Ali bez obzira što je "lista" lokalna, pre nego što bude uništena, ona će biti iskopirana jer ne vraća kao povratnu vrednost referencu već je vraća po vrednosti.

A ako pretpostavimo da negde u kodu ima poziv:

Code:

Klasa obj;
Lista L = obj.filtriraj();


kompajler obično ovde vrši RVO, tako da će to da "pretoči" u nešto ovako:

Code:

Klasa obj;
Lista L;
obj.filtriraj(L);


da nebi bilo jedne suvišne kopije u "return lista".

Ja bih testirao lepo konstruktor kopije, jer može da se desi da je tamo problem. (Tj. sumnjam da konstruktor kopije radi deep copy kako treba, pa možda onda neki destruktor negde nešto uništava)
 
Odgovor na temu

DjoleReject
Djordje Knezevic
Zvezdara

Član broj: 85258
Poruke: 309
*.dynamic.sbb.rs.



+1 Profil

icon Re: Vracanje objekta iz metode i izvrsavanje destruktora17.04.2009. u 13:51 - pre 181 meseci
Citat:
Goran Arandjelovic: Ali bez obzira što je "lista" lokalna, pre nego što bude uništena, ona će biti iskopirana jer ne vraća kao povratnu vrednost referencu već je vraća po vrednosti.


Da, bez obzira na to sto je objekat lista lokalan, on se vrati po vrednosti i to ne predstavlja problem. Proveri destruktor Elm-a i destruktor Liste. Jos bolje, napisi ih ovde, pa cemo naci sta je problem.
De si Deda...
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Vracanje objekta iz metode i izvrsavanje destruktora17.04.2009. u 16:33 - pre 181 meseci
Citat:
Ja bih testirao lepo konstruktor kopije, jer može da se desi da je tamo problem. (Tj. sumnjam da konstruktor kopije radi deep copy kako treba, pa možda onda neki destruktor negde nešto uništava)


Da, ovo je pravi uzrok problema.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Vracanje objekta iz metode i izvrsavanje destruktora

[ Pregleda: 2814 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.