[ Pretender @ 16.09.2003. 23:26 ] @
Code:

1:     // Listing 9.14
2:      // Resolving memory leaks
3:      #include <iostream.h>
4:
5:      class SimpleCat
6:      {
7:      public:
8:              SimpleCat (int age, int weight);
9:             ~SimpleCat() {}
10:            int GetAge() { return itsAge; }
11:            int GetWeight() { return itsWeight; }
12:
13      private:
14:           int itsAge;
15:           int itsWeight;
16:      };
17:
18:      SimpleCat::SimpleCat(int age, int weight):
19:      itsAge(age), itsWeight(weight) {}
20:
21:      SimpleCat & TheFunction();
22:
23:      int main()
24:      {
25:           SimpleCat & rCat = TheFunction();
26:           int age = rCat.GetAge();
27:           cout << "rCat is " << age << " years old!\n";
28:           cout << "&rCat: " << &rCat << endl;
29:           // How do you get rid of that memory?
30:           SimpleCat * pCat = &rCat;
31:           delete pCat;
32:           // Uh oh, rCat now refers to ??
33:     return 0;
34:      }
35:
36:      SimpleCat &TheFunction()
37:      {
38:           SimpleCat * pFrisky = new SimpleCat(5,9);
39:           cout << "pFrisky: " << pFrisky << endl;
40:           return *pFrisky;
41: }

Output: pFrisky:  0x2bf4
rCat is 5 years old!
&rCat: 0x2bf4


Citat:
So far, so good. But how will that memory be freed? You can't call delete on the reference. One clever solution is to create another pointer and initialize it with the address obtained from rCat. This does delete the memory, and plugs the memory leak. One small problem, though: What is rCat referring to after line 31? As stated earlier, a reference must always alias an actual object; if it references a null object (as this does now), the program is invalid.

Citat:

There are actually three solutions to this problem. The first is to declare a SimpleCat object on line 25, and to return that cat from TheFunction by value. The second is to go ahead and declare the SimpleCat on the free store in TheFunction(), but have TheFunction() return a pointer to that memory. Then the calling function can delete the pointer when it is done.
The third workable solution, and the right one, is to declare the object in the calling function and then to pass it to TheFunction() by reference.


Moze li mi neko od specijalista ispisati to 3. i pravo resenje ?


Hvala
[ boccio @ 20.09.2003. 10:37 ] @
ako se ne varam, ovo su primeri iz knjige jesse liberty-ja, zar ne?
[ Pretender @ 20.09.2003. 16:59 ] @
Da (ako ce to nesto pomoci).
[ Dragi Tata @ 20.09.2003. 19:11 ] @
Ajde, danas sam dobre volje - doterali su mi mašinu za veš, ali u principu ti savetujem da nađeš neku ljudsku knjigu. Kažu da je za početnike najbolja ova:

http://www.acceleratedcpp.com/

Uglavnom, evo koda:

Code:

#include <iostream>
using namespace std;

class SimpleCat
    {
    public:
        SimpleCat (int age, int weight):
            itsAge(age), itsWeight(weight) {}
        ~SimpleCat() {}
        int GetAge() { return itsAge; }
        int GetWeight() { return itsWeight; }

    private:
        int itsAge;
        int itsWeight;
    };


void TheFunction(SimpleCat&);

int main()
    {
    SimpleCat rCat(0,0);       
    TheFunction(rCat);
    int age = rCat.GetAge();
    cout << "rCat is " << age << " years old!\n";
    cout << "&rCat: " << &rCat << endl;
    }

void TheFunction(SimpleCat& cat)
    {
    SimpleCat Frisky(5,9);
    cout << "Frisky: " << &Frisky << endl;

 //Ovo radi jer su itsAge i itsWeight value tipovi
 //da su pointeri bilo bi belaja
    cat = Frisky; 
    }
[ leka @ 20.09.2003. 19:29 ] @
Ja ne volim Get/Set metode. Ne kapiram zasto ljudi vise vole da imaju dva metoda umesto jednog, overloadovanog. GetNesto je isto sto i Nesto() , a SetNesto() je isto sto i (recimo) Nesto(int arg) ...
[ Dragi Tata @ 20.09.2003. 20:16 ] @
Hehe, to znači da tebi više pasuje C# (properties) nego Java (get - set). Mislim da je to jedna od onih stvari koje jesu stvar ukusa. Lično mislim da Get/Set metode ponekad previše otkrivaju unutrašnjost klase i tako štete enkapsulaciji.
[ -zombie- @ 20.09.2003. 20:54 ] @
ne, njemu još više leži Delphi (iz koga su c# propertiji ;).

Citat:
Dragi Tata:
Lično mislim da Get/Set metode ponekad previše otkrivaju unutrašnjost klase i tako štete enkapsulaciji.


da li bi hteo da ovo malo elaboriraš? ovo verovatno isto važi i za propertije (koji su isto to, samo druga sintaxa).

ne razumem kako to otkriva unutrašnjost? pa get/set funkcija uopšte ne mora da čita/piše neku privatnu promenjivu objekta, već može da poziva druge metode...
[ Dragi Tata @ 20.09.2003. 22:39 ] @
Citat:
-zombie-:
ne razumem kako to otkriva unutrašnjost? pa get/set funkcija uopšte ne mora da čita/piše neku privatnu promenjivu objekta, već može da poziva druge metode...


Pa zato sam ja rekao "ponekad", a ti "može". U gornjem primeru je manje-više sve u redu jer Get funkcije vraćaju kopije unutrašnjih promenljivih. A šta bi bilo da vraćaju pointere/reference na te promenljive? To mu dođe potpuno isto kao da su stavili promenljive u public deo.
[ Pretender @ 21.09.2003. 22:54 ] @

Hvala, Dragi Tata. [Nadam se da ce vesmasina raditi dobro]
[ Pretender @ 21.09.2003. 23:18 ] @
Vidim da je knjiga koju si preporucio dosta hvaljena, ali nisam uspeo da nadjem e-verziju, iako sam u poslednje vreme pronasao i skinuo nekoliko slicnih knjiga (Thinking in C++, The C++ Primer(hvala leki) i `moju` knjigu(hvala srkiju)).
[ dust @ 24.09.2003. 11:25 ] @
Jel može link za C++ Primer?
[ Pretender @ 24.09.2003. 16:25 ] @
http://www-math.cudenver.edu/~jwilson/cpp_primer/CPP_PRIMER/
[ filmil @ 24.09.2003. 19:16 ] @
Gledam u prevod, gledam u ovaj tvoj link, pa mi se sve čini da to nije to.

f
[ leka @ 25.09.2003. 08:28 ] @
Evo linka koji je "povezan" sa knjigom - http://www.amazon.com/exec/obi...ref=sr_2_1/104-7090890-1727116 . Inace knjiga je odavno prevedena na nas jezik, moze se kupiti na http://www.knjizara.co.yu/pls/sasa/knjizara.knjiga?k_id=14207