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

Andrada Georgescu andradaq at gmail.com
Sat Mar 6 18:27:21 EET 2010


2010/3/6 Dan-George Filimon <dangeorge.filimon at gmail.com>

> Nu mi-e clar cum anume implementez adunarea in cazul ala. Oricum la adunare
> trebuie creat un nou obiect care sa fie intors, deci as putea face asa:
>
> const mine mine::operator+(const mine& x) {
>         mine helper(max(x.n, this->n));
>         helper.n = max(x.n, this->n);
>        int i;
>         for (i = 0; i < helper.n; ++ i)
>                 helper.A[i] = this->A[i] + x.A[i];
>        for (; i < helper.n; ++ i)
>                if (i >= x.n)
>                        helper.A[i] = this->A[i];
>                else
>                        helper.A[i] = x.A[i];
>        //helper->print();
>        return helper;
> }
>
> si in main() am
>
> z = x + y;
>
> unde operatorul = e definit ca si copy-constructorul tau. Asa e ok?
>
> On Mar 6, 2010, at 6:06 PM, Andrada Georgescu wrote:
> > Nu ar trebui să aloci dinamic acolo un nou obiect, îți produce leak-uri
> (tu nu vei știi niciodată să eliberezi zona alocată
> > pentru obiect în sine). Trebuie, după cum spunea și Andrei să îțî
> definești și un copy-constructor, pe lângă assignment.
> > De exemplu:
> >
> > mine(const mine &x) {
> >     this->A = new int[x.n];
> >     this->n = x.n;
> >     memcpy(this->A, x.A, x.n * sizeof(int));
> > }
>

Pare ok, dar va trebui să îi definești pe amândoi, altfel, la iesirea din
definirea +, nu va ști exact cum să întoarcă valoarea (efectiv o copie) a
obiectului tău alocat pe stivă și se va apela copy-constructorul implicit,
care doar va atribui pointerului obiectului
nou creat vechea adresă (dar care între timp a fost eliberată la ieșirea din
scop - adică din funcție).


-- 
Andrada Georgescu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rosedu.org/pipermail/cdl-studenti/attachments/20100306/9042395a/attachment-0001.htm>


More information about the cdl-studenti mailing list