[cdl-studenti] [OOP] Eliberare automata de memorie.

Iulian-Nicu Şerbănoiu undergraver at gmail.com
Sat Mar 6 19:01:17 EET 2010


Salut Marius,

Sper ca asta sa te ajute:

http://www.stanford.edu/class/cs107l/handouts/02-Copy-Constructors.pdf
[Hint: initializeFrom poti sa o modifici dupa gusturile tale - desi
face exact ce vrei tu]

Aici si pentru operatorul +:
http://www.stanford.edu/class/cs107l/handouts/03-Operator-Overloading.pdf

Aici sunt toate cursurile: http://www.stanford.edu/class/cs107l/handouts/

Fii *foarte* atent cu sintaxa operatorului + (returneaza o valoare nu
o referinta).

E vorba de copy constructor si operatorul = si modul de implementare
al lor in general. Trebuie sa citesti despre asta inainte de a
intelege codul. Copy constructorul e extrem de important in C++, mai
ales pentru obiecte care au in cadrul lor declarate tipuri pentru care
un "shallow copy" nu este de ajuns (cum ar fi pointerii de exemplu -
lucru prezent si in cazul tau)

Avand in vedere ca lucrul cu stringuri este destul de bizar in C
(pentu ca ceea ce faci tu este transpunera stringurilor C [ASCIIZ]
intr-un obiect C++) poti folosi direct clasa std::string (e un
template), evident dupa ce ai inteles problema initiala.

Bafta,

2010/3/6 marius Dragus <mdragus at gmail.com>:
> Salut,
>
> Incerc sa scriu o clasa "mine" in C++ care sa permita operatorul +.
> Problema este ca fiecare obiect aloca dinamic un array, iar o operatie de
> genul x =a +b+c ar cauza memory leak-uri.
>
> Cum s-ar putea face asta?
>
> Mai jos este codul. Mentin un contor al constructorilor/destructorilor, si
> se vede evident ca se obtin memory leakuri.
>
> Mersi,
> Marius
>
> /*************************CODE*********************/
>
> #include <iostream>
>
> int count = 0;
> using namespace std;
>
> struct mine
> {
>     int * u;
>     mine()
>     {
>     u = new int[10000];
>     count++;
>     }
>
>     ~mine()
>     {
>     delete[] u;
>     count--;
>     }
>
>     mine & operator=(const mine & x)
>     {
>     //cout << "assign" << endl;
>     u = x.u;
>     }
>
>
> };
>
> mine& operator+(const mine & x, const mine &y)
> {
>     mine * ret = new mine;
>     return *ret;
> }
>
> int main()
> {
>
>     mine a, b, c, d;
>     mine e;
>
>
>     for (int i = 0; i<10; i++)
>     {
>     e = a + b + c + d;
>
>     }
>
>     cout << count << "\n"; // afiseaza 35 desi ar trebui sa fie 5
>
>     return 0;
> }
>
>
> _______________________________________________
> cdl-studenti mailing list
> cdl-studenti at lists.rosedu.org
> http://lists.rosedu.org/listinfo/cdl-studenti
>



-- 
Iulian Şerbănoiu
MinVG - http://minvg.sourceforge.net


More information about the cdl-studenti mailing list