» »

[VC++] čuden memory leak

[VC++] čuden memory leak

MrStein ::

Ko v Visual Studio 2005 poženem program, mi na koncu napiše :

Detected memory leaks!
Dumping objects ->
f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {304} normal block at 0x003BABB0, 30 bytes long.
 Data: < 9Px            > AC 39 50 78 06 00 00 00 06 00 00 00 01 00 00 00 
Object dump complete.




Program je v bistvu tole;
// .h fajl

class CFoo
{
public:
    virtual void ReadParameters(std::vector<std::string> &a_words){
    }
};

class CBar : public CFoo
{
public:
    boolean SetStringID(std::string &a_stringId);
    virtual void ReadParameters(std::vector<std::string> &a_words);

protected:
    CString m_stringId;
};


// .cpp fajl:


boolean CBar::SetStringID(std::string &a_stringId)
{
    //m_stringId = CString("foobar"); // tudi samo ta vrstica naredi leak
    //m_stringId.AppendChar('x'); // ali ta
    m_stringId.Append(CString(a_stringId.c_str()));
    return true;
}

void CBar::ReadParameters(std::vector<std::string> &a_words){
   SetStringID(a_words[1]);
}


// "aktivna" koda pa je:

// ...
CFoo x = new CBar;
x->ReadParameters(en_vektor_s_stringi);
delete x;


Zakaj one vrstice v metodi SetStringID povzročijo leak ? Če jih ni, ni leaka.

Zdaj sem odkril, da če member m_stringId definiram v CFoo, ne pa v CBar, potem ni leaka, samo ne morem vse memberje podrazredov v nadrazred zmetat, kje je potem smisel objektnega programiranja ?

Kaka ideja ?

LP,
David
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Senitel ::

Virtualni destruktorji delajo čudeže... ;)

MrStein ::

Ja, je ravno sodelavec namignil. Hvala.

C++ sux.... (v primerjavi z Javo. Kot da bi v assemblerju programiral)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

arjan_t ::

cilj c++ je hitrost in majhna poraba rama, svojo nalogo opravlja dobro

iztok04 ::

Po mojem je problem v staticni definiciji x objekta tipa CFoo: CFoo x = new CBar;
Poizkusi tole:

CBar x = new CBar;
x.ReadParameters(en_vektor_s_stringi);
delete x;

ali pa:
CBar *x = new CBar;
x->ReadParameters(en_vektor_s_stringi);
delete x;

MrStein ::

Prvo je sintaktično narobe, drugo pa ne pride v poštev, ker koda mora delovati z vsemi podrazredi od CFoo.


arjan_t:
cilj c++ je hitrost in majhna poraba rama, svojo nalogo opravlja dobro

Heh, sem nedavno pisal en program v Javi.
Nato sem ga napisal še v C, ter še v C++.
Ugani razmerje hitrosti.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Senitel ::

Zelo odvisno kaj počneš... Generalno pa C/C++ ne bi smel bit počasnejši od Jave. Oziroma, če je počasnejši, potem počneš nekaj narobe.
Sicer je iztok04 verjetno meril na napako v tvoji kodi, ki si jo postal zgoraj:
CFoo x = new CBar;
x->ReadParameters(en_vektor_s_stringi);
delete x;

MrStein ::

Ja, zvezdica manjka v "CFoo *x = new CBar;"

C
Java
C++

Mislim, da je C++ delal kar 2x dlje kot Java verzija.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Senitel ::

Je to kakšen relativno enostaven primer, ki se ga da videt (kodo)?

MrStein ::

Ne ravno. Gre za eno obdelavo geometričnih podatkov.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

l0g1t3ch ::

Jest sm že kar dosti stvari naredu v Javi pa se mi ne zdi da bi bila ravno počasna.
Nazadnje sm delal neke stvari z zanavanjem gibanja in sm prenesel nekaj kode iz Aforge knjižice ki je za C# in je spisana z uporabo kazalcev (torej zelo C like koda ) v Javo pa stvar nevem če je bla par % počasnej.

Jean-Paul ::

Hja, tudi v asemblerju se da napisati stvari tako, da tečejo počasneje kot v npr. basicu. Hitrost izvajanja je treba primerjati čim bolj objektivno.

l0g1t3ch ::

jest sm naredu samo rewrite kode v drug jezik nic drugega

arjan_t ::


Heh, sem nedavno pisal en program v Javi.
Nato sem ga napisal še v C, ter še v C++.
Ugani razmerje hitrosti.


nisem napisal da je C/C++ hitrostni prvak, če že primerjaš z javo primerjaj še porabo ram-a
in ne mislim da je java ipd. slab jezik

Senitel ::

Kaj je bila potem bistvena razlika v kodi med C in C++?

MrStein ::

Ja v C++ sem uporabil razrede. Več ali manj 1:1 kot v Javi.
V C pa sem moral "poenostaviti", ker pač ni objektno orientiran jezik.

Če te zanima, ti lahko pošljem C in C++ kodo.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Senitel ::

Daj mi maili, ker me res firbec matra... :D Mail je v profilu.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

"Dinamicna" sprememba razreda v C++

Oddelek: Programiranje
131933 (1325) Spura
»

Android - Začetnik

Oddelek: Programiranje
111794 (1119) hurlimannxt
»

[Java] Objekt poslan k metodi v kakšnem stanju?

Oddelek: Programiranje
211565 (1012) shadeX
»

[C#] izdelava tabele

Oddelek: Programiranje
72000 (1826) majoneza
»

problem v C#

Oddelek: Programiranje
211976 (1691) dvojka

Več podobnih tem