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

marius Dragus mdragus at gmail.com
Sat Mar 6 16:47:04 EET 2010


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 apeleaza destuctorul pentru z ( double free).
>
>
>
> 2010/3/6 Dan-George Filimon <dangeorge.filimon at gmail.com>
>
>> Atunci, de ce nu:
>>
>> mine operator+ (const mine x) {
>>  mine y;
>> memcpy(y.u, x.u, 10000 * sizeof(int));
>> return y;
>> }
>>
>> Ideea fiind ca la final, y fiind un obiect va fi distrus automat cand iesi
>> din main prin apelul destructorului. Ce faci tu e sa creezi un non-obiect in
>> operator+ si banuiesc ca de-aia nu merge.
>>
>> On Mar 6, 2010, at 4:29 PM, marius Dragus wrote:
>>
>> Pai operatorul + nu ar trebui sa modifice obiectul curent.
>> De exemplu pe stringuri:
>>
>> string x ="ana";
>> string y ="are";
>> string z = x+y;
>>
>> cout<< x; //afiseaza "ana", x nu e modificat.
>>
>>
>> 2010/3/6 Dan-George Filimon <dangeorge.filimon at gmail.com>
>>
>>> Nu inteleg de ce ai in definitia operatorului + o noua alocare de
>>> memorie.
>>> De ce nu folosesti pointerul this?
>>>
>>> Cand faci un operator ca + m-as gandi ca ai ceva de genul:
>>> mine operator+(const mine x) {
>>>         memcpy(this->u, x.u, 10000 * sizeof(int));
>>>        return *this;
>>> }
>>>
>>> Asta nu ar face ce vrei?
>>>
>>> On Mar 6, 2010, at 4:20 PM, marius Dragus wrote:
>>>
>>> > 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
>>>
>>> _______________________________________________
>>> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rosedu.org/pipermail/cdl-studenti/attachments/20100306/84bfa856/attachment.htm>


More information about the cdl-studenti mailing list