[cdl-studenti] [OOP] Eliberare automata de memorie.
Andrei Soare
andrei.soare at gmail.com
Sat Mar 6 17:25:52 EET 2010
Se elibereaza, intr-adevar, dar dupa ce se copiaza in z. Se va apela apoi destructorul lui y si in final si pe cel al lui z si intr-adevar o sa faca free de 2 ori pe aceeasi zona de memorie.
Ca sa nu faca free de 2 ori pe aceeasi zona de memorie, trebuie neaparat implementat copy constructor si copy assignment operator sa aloce o zona noua de memorie pentru toate datele alocate dinamic din clasa.
Mereu cand o clasa are membri alocati dinamic trebuie implementat de mana copy constructor si copy assignment operator.
-----Original Message-----
From: marius Dragus
Eu am testat si se cam elibereaza. Se apeleaza destructorul pentru variabila
locala y.
2010/3/6 Dan-George Filimon <dangeorge.filimon at gmail.com>
> Nu se elibereaza y cand zici tu la pasul 2 din cate inteleg eu.
>
>
> On Mar 6, 2010, at 4:41 PM, marius Dragus wrote:
>
> Nu e ok. Varianta asta e gresita din mai multe motive (produce double free,
> copiaza memorie inexistenta).
>
> z= x+y;
>
> 0. Se apeleaza operatorul + pentru x
> 1. Se aloca y in operator+.
> 2. Se apeleaza destructorul pentru y
> 3. Se apeleaza operatorul de asignare pentru z ( dar partea dreapta a fost
> eliberata deja la pasul 2 -- deci e gresit)
> 4. Se apelte 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
>>>
>>> _______________________________________________
>>> cdl-studenti mailing list
>>> cdl-studenti at lists.rosedu.org
>>> http://lists.rosedu.org/listinfo/cdl-studenti
>>>
>>
>> _______________________________________________
>> cdl-studenti mailing list
>> cdl-studenti at lists.rosedu.org
>> http://lists.rosedu.org/listinfo/cdl-studenti
>>
>>
>>
>> _______________________________________________
>> cdl-studenti mailing list
>> cdl-studenti at lists.rosedu.org
>> http://lists.rosedu.org/listinfo/cdl-studenti
>>
>
> _______________________________________________
> cdl-studenti mailing list
> cdl-studenti at lists.rosedu.org
> http://lists.rosedu.org/listinfo/cdl-studenti
>
>
>
> _______________________________________________
> cdl-studenti mailing list
> cdl-studenti at lists.rosedu.org
> http://lists.rosedu.org/listinfo/cdl-studenti
>
More information about the cdl-studenti
mailing list