Kezdőoldal » Számítástechnika » Programozás » El tudnátok magyarázni, mert...

El tudnátok magyarázni, mert nem értem a magyarázatot?

Figyelt kérdés

cCat & cCat::operator=(const cCat &rhs) {

if(this == &rhs)

return *this;

delete i_age; /*Lentebb a magyarázat,hogy miért jó programozói szokás törölni és újra lefoglalni a memóriát de nem értem a magyarázatot mert még nem volt dolgom ilyen a lentebb említett problémával.És még nem is értem annyira mert még nem vagyok egy olyan eléggé erős haladó szinten.Ettől függetlenül szeretném ha tudnátok segíteni.Egy kezdőnek való a lentebb látható sokkal egyszerűbb magyarázattal.*/

i_age = new int(rhs.i_getAge());

return *this; }


Töröljük, majd újra létrehozzuk a tagváltozókat

a memóriában. Noha ez nem kötelező, jó és korrekt programozói szokás, mert megkímél a memóriaszivárgás okozta problémáktól, amikor olyan változó hosszúságú objektumokkal dolgozunk, melyek nem rendelkeznek saját hozzárendelési operátorral.


Magyarázzátok el,hogy miért jó programozói szokás felszabadítani és újra lefoglalni a memóriát az operator= ben.


2012. szept. 14. 15:09
 1/7 iostream ***** válasza:
41%

Alapvetően nem jó szokás, sőt, hülye szokás. Eleve hülye szokás mindent mutatóval kezelni.

A kulcs itt van:

"amikor olyan változó hosszúságú objektumokkal dolgozunk, melyek nem rendelkeznek saját hozzárendelési operátorral."


Ha a

*this->x = *rhs->x;

eredménye hibás (mert az x objektum típusához nincs megfelelő operator=, és a másolása nem triviális), akkor egyszerűbb letörölni és újrakonstruálni.

Persze letörném a kezét annak is, aki normális másoló konstruktort ír, de nem írja meg az operator=-t.

2012. szept. 14. 15:34
Hasznos számodra ez a válasz?
 2/7 anonim ***** válasza:
Jól mondja az első. Annyit fűznék csak hozzá, hogy egész egyszerűen azért kell felszabadítani és újra lefoglalni a memóriát, mert lehet, hogy egy tagváltozó már mutat valamilyen dinamikusan lefoglalt memóriára. Ha ezt a változót csak simán felülírod, akkor az előzőleg lefoglalt memória nem szabadul fel, csak elérhetetlenné válik. Aztán ha ez az értékadás jó sokszor végrehajtódik, akkor a programod szépen felzabálja a memóriát. Ahogy az első is írta, ez csak mutatókkal fordul elő. :)
2012. szept. 14. 16:02
Hasznos számodra ez a válasz?
 3/7 A kérdező kommentje:

A 16:02 válaszolót értem adtam zöld kezet,de ezt tudtam is amit mondtál hisz logikus,ha nem szabadítom fel csak hozzárendelek új címet akkor a régi elérhetetlenné válik.


De az iostream válaszát nem értem sajnos.Van egy olyan érzésem,hogy az iostream olykor-olykor tudna érthetőbben is fogalmazni de direkt nem teszi de ő ilyen így kell őt szeetni ezért adtam neki is egy zöld kezet.


Pls magyarázzátok el érthetőbben amit iostream írt.

2012. szept. 14. 17:01
 4/7 anonim ***** válasza:

Igazából a kérdésben lévő példa egy speckó eset, mert ennek tényleg nem nagyon látom értelmét. Mármint hogy egy int-et dinamikusan foglaljunk le. :) De pl. képzeld el, hogy az i_age nem int, hanem az Age classból létrehozott objektum. És mondjuk minden korrekten meg van benne írva, és a cél az objektumok klónozása, vagyis minden objektum tartalmát átmásoljuk egy külön memóriaterületre.


delete i_age; /* lefut az i_age destruktora, felszabadul az általa foglalt memória */

i_age = rhs->i_age; /* lefut az i_age operator=-je */


És az i_age operator=-jében ugyanezek a procedúrák mehetnek végbe az ő saját dinamikus tagváltozóival. Remélem, nem írtam hülyeséget. :) Amúgy ezek szerint érted, csak a kitekert magyartalan megfogalmazások között nem tudsz kiigazodni.

2012. szept. 14. 18:03
Hasznos számodra ez a válasz?
 5/7 anonim ***** válasza:

Előző példához egy kis javítás:


delete i_age;

i_age = new Age();

*i_age = *rhs->i_age;

2012. szept. 14. 18:38
Hasznos számodra ez a válasz?
 6/7 A kérdező kommentje:

Hát én még mindig nem értem mit akartok mondani.

És tényleg semmi értelme törölni és újra lefoglalni az operato= ben.


Kicsit felidegeskedtem.

2012. szept. 14. 18:38
 7/7 iostream ***** válasza:

struct SzarTipus

{

int size;

int* data;

SzarTipus(int size): size(size), data(new int[size]) {}

SzarTipus(const SzarTipus& oth): size(oth.size), data(new int[oth.size]) {}

~SzarTipus() {delete data;}

};


Van egy ilyen típusod. A konstruálás és a destruálás korrekt, de az operator=-t lehagyták. Emiatt nem működik helyesen a default =, egyszerűbb lezúzni és újrakonstruálni, mint kézzel kitalálni, hogy hogy lehet értelmesen másolni.

2012. szept. 15. 11:21
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!