[Tutorial C/C++/C#] Destructorii claselor

Locked
User avatar
LaUR SNG
Fondator
Fondator
Posts: 9038
Joined: 8 years ago
Location: SNAGOV
Has thanked: 11 times
Been thanked: 6 times
Zodiac:
Age: 21
Contact:
Status: Offline
Romania

8 years ago

Nume Tutorial: Destructorii claselor încuibărite
Descriere: Un tutorial folositor pentru cei care lucreaza in limbajul de programare C++
Download: -
Autor: Nu este specificat
Sursa (Link-ul oficial):
tutorialeprogramare.ro


Propria parere: Folositor
Tutorialul: Mai jos .

In problema apelului destructorilor claselor incuibarite se impun doua observatii, pe care le vom discuta pe exemplul ce urmeaza.

Code: Select all

class baza {
class incuib1 ob1;
class incuib2 ob2;
// ...
public:
// ...
~baza(void);
} ob0;
Sublinierile ce se impun sunt:

a. Apelul destructorilor obiectelor "ob1" si "ob2" se va face doar DUPA executia destructorului "~baza".
b. In cazul in care se prefera ca in loc de obiecte incuibarite sa se foloseasca membrii de tipul "pointer la obiect" (incuibarire indirecta), v fi necesara atat alocarea dinamica, cat si eliberarea EXPLICITA a memoriei necesare pentru obiectele la care vor pointa membrii in cauza. De obicei astfel de actiuni au loc in cadrul constructorului, respectiv destructorului clasei "cuib".

Erori deosebite.

Un prim caz care se cere studiat cu atentie este cel din exemplul de mai jos:

Exemplu:

Code: Select all

class ex {
double * pNumar;
public:
ex(double);
~ex();
};

ex::ex(double nr) {
pNumar=new double;
*pNumar=nr;
}

ex::~ex(void) {
// ...
delete pNumar;
}

Code: Select all

void main(void) {
ex b1(10.66);
ex b2=b1; // 1
ex b3(20.101);
b1=b2=b3; // 2
}
Liniile etichetate cu 1 si 2 sunt generatoare de erori subtile si greu de detectat. La baza generarii lor sta mecanismul de copiere bit cu bit a obiectelor. Acesta poate fi utilizat in doua situatii: la atribuiri sau apeluri ale constructorului implicit de copiere. Eroarea nu apare la copiere, ci la apelul destructorilor, care vor fi siliti sa elibereze de mai multe ori una si aceeasi zona de memorie. Acest fapt se datoreaza copierii in membrii lui "b1" si "b2" a adresei memorate in "b3". In astfel de situatii comportarea programului poate deveni bizara, de obicei provocand blocarea sistemului.[/b]
„Iubiti totul cu toată inima ... căci viața se termină când vrea ea si pe nepusă masă !” – LaUR SNG

https://photos.app.goo.gl/WbQsF4C9QfvDvWSo6

Curios ? Nu il deschide :13:

[spoiler]Image[/spoiler]
[spoiler]Image[/spoiler]

https://www.facebook.com/10043517804227 ... 039605115/
Locked

Return to “C / C++ / C#”