[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