|
| override new Fra : Jason Who |
Dato : 06-02-03 11:54 |
|
Hvis man overrider operator new, så skal man selvsagt selv allokere pladsen.
Som det er nu, så bruger jeg malloc internt i min new funktion, siden det
vil lave et loop at kalde new derfra.
Men... argumentet for at bruge new istedet for malloc er jo at malloc kun
allokere plads, og ikke kalder eventuelle constructors for et objekt.
Siden new ikke kan kalde new, og istedet bruger malloc, så er effekten jo at
new ikke længere kalder constructors for objekter.
Hvad er løsningen på det problem?
| |
Claus Rasmussen (06-02-2003)
| Kommentar Fra : Claus Rasmussen |
Dato : 06-02-03 12:10 |
|
Jason Who wrote:
> Hvis man overrider operator new, så skal man selvsagt selv allokere
> pladsen. Som det er nu, så bruger jeg malloc internt i min new funktion,
> siden det vil lave et loop at kalde new derfra.
> Men... argumentet for at bruge new istedet for malloc er jo at malloc kun
> allokere plads, og ikke kalder eventuelle constructors for et objekt.
>
> Siden new ikke kan kalde new, og istedet bruger malloc, så er effekten jo
> at new ikke længere kalder constructors for objekter.
Nja. new kalder aldrig constructoren. I stedet sørger compileren for,
at kalde constructoren efter new - uanset om du selv har defineret
new, eller du bare bruger den indbyggede.
Der er i øvrigt ikke meget ide i, at bruge malloc, da den indbyggede
new i de fleste implementationer selv kalder new. Man redefinerer
normalt kun new, når man kan bruge specielle allokeringsteknikker.
F.eks hvis du har en liste af int, kan du allokere en masse liste-
knuder på een gang, og så bruge new til at dele ud af dem een ad
gangen. Det er meget hurtigere end at lade new kalde malloc en
masse gange.
-Claus
| |
Claus Rasmussen (06-02-2003)
| Kommentar Fra : Claus Rasmussen |
Dato : 06-02-03 12:18 |
|
Claus Rasmussen wrote:
> Der er i øvrigt ikke meget ide i, at bruge malloc, da den indbyggede
> new i de fleste implementationer selv kalder new. Man redefinerer
^^^
malloc
-Claus
| |
Mogens Hansen (06-02-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 06-02-03 18:17 |
|
"Jason Who" <jw@nomail.here> wrote
> Hvis man overrider operator new, så skal man selvsagt selv allokere
> pladsen. Som det er nu, så bruger jeg malloc internt i min new
> funktion, siden det vil lave et loop at kalde new derfra.
Ja, det kan man sagtens gøre.
(Det er dog sjældent at man reelt har brug for at overskrive new)
> Men...
> argumentet for at bruge new istedet for malloc er jo at malloc kun
> allokere plads, og ikke kalder eventuelle constructors for et objekt.
Har du prøvet ?
Giver det dig _faktisk_ problemer ?
Prøv at single steppe gennem et ligge program med din debugger, og se hvad
der sker.
new kalder _aldrig_ constructoren.
new allokerer udelukkende hukommelse.
Når man skriver
new foo;
er det compilerens opgave først at kalde "operator new" og derefter kalde
"foo::foo".
Det er en almindelig misforståelse at new implicit kalder constructoren
eller constructoren implicit kalder new - men sådan er det ikke.
[8<8<8<]
> Hvad er løsningen på det problem?
Der er ikke noget problem.
Venlig hilsen
Mogens Hansen
| |
Jason Who (07-02-2003)
| Kommentar Fra : Jason Who |
Dato : 07-02-03 07:41 |
|
> Ja, det kan man sagtens gøre.
> (Det er dog sjældent at man reelt har brug for at overskrive new)
Ja. Jeg vil imidlertid gerne nemt kunne fange memoryleaks i en eksisterende
app. Hvis der er andre måde, udover div eksterne programmer, så hører jeg
meget gerne nærmere.
> new kalder _aldrig_ constructoren.
> new allokerer udelukkende hukommelse.
>
> Når man skriver
> new foo;
> er det compilerens opgave først at kalde "operator new" og derefter kalde
> "foo::foo".
>
> Det er en almindelig misforståelse at new implicit kalder constructoren
> eller constructoren implicit kalder new - men sådan er det ikke.
Ok. Jeg har faktisk ikke prøvet. Vil gøre det om lidt.
Det er ikke fordi jeg troede funktionen new kaldte constructoren, men fordi
jeg havde læst at malloc specifikt ikke fik kaldet den. Igen ikke at malloc
ikke kalder, men formuleret anderledes...
ved brug af new kaldes constructoren. Det sker ikke ved malloc.
Som sagt har jeg ikke testet det.
| |
Jens Axel Søgaard (07-02-2003)
| Kommentar Fra : Jens Axel Søgaard |
Dato : 07-02-03 13:03 |
|
"Jason Who" <jw@nomail.here> skrev i en meddelelse news:b1vkag$1888$1@news.net.uni-c.dk...
> > Ja, det kan man sagtens gøre.
> > (Det er dog sjældent at man reelt har brug for at overskrive new)
>
> Ja. Jeg vil imidlertid gerne nemt kunne fange memoryleaks i en eksisterende
> app. Hvis der er andre måde, udover div eksterne programmer, så hører jeg
> meget gerne nærmere.
Boehms berømmelige garbage collector kan vist også bruges som
"leak detector":
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html
--
Jens Axel Søgaard
| |
Rasmus Christian Kaa~ (20-02-2003)
| Kommentar Fra : Rasmus Christian Kaa~ |
Dato : 20-02-03 09:27 |
|
"Jens Axel Søgaard" <usenet@soegaard.net> wrote in message
news:3e43a19f$0$71657$edfadb0f@dread11.news.tele.dk...
> "Jason Who" <jw@nomail.here> skrev i en meddelelse
news:b1vkag$1888$1@news.net.uni-c.dk...
> > > Ja, det kan man sagtens gøre.
> > > (Det er dog sjældent at man reelt har brug for at overskrive new)
> >
> > Ja. Jeg vil imidlertid gerne nemt kunne fange memoryleaks i en
eksisterende
> > app. Hvis der er andre måde, udover div eksterne programmer, så hører
jeg
> > meget gerne nærmere.
>
> Boehms berømmelige garbage collector kan vist også bruges som
> "leak detector":
>
> http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html
Jeg har endnu ikke fået den til at virke sammen med min egen kode... Jeg
forsøgte at linke en VM vi lavede i efteråret 2002 med den nævnte gc, men
der kom massere af linker-fejl m.m.
| |
Mogens Hansen (07-02-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 07-02-03 18:55 |
|
"Jason Who" <jw@nomail.here> wrote
[8<8<8<]
> Ja. Jeg vil imidlertid gerne nemt kunne fange memoryleaks i en
eksisterende
> app.
Lidt banalt, og måske provokerende sagt, så er den nemmeste måde at undgå
memoryleaks at lade være med at lave dem.
I praksis betyder det at man indkapsler allokering i klasser, som så har
ansvaret for at frigive hukommelsen.
Brug Standard C++ klasser, som f.eks.
std::string
std::vector
std::auto_ptr
men også smart pointerne fra f.eks. Boost ( www.boost.org) kan være nyttige.
> Hvis der er andre måde, udover div eksterne programmer, så hører jeg
> meget gerne nærmere.
Dedikerede værktøjer er i længden mere effektive end at overskrive new:
* De giver dig typisk kaldestakken, til hvor allokeringen fandt sted
* De finder en lang række andre typiske fejl, såsom
* Brug af pointere til frigivet hukommelse (dangling pointer)
* Overskrivning af hukommelses-områder (buffer overrun)
Jeg kan derfor kun anbefale at finde et værktøj, der passer til din platform
og compiler.
Venlig hilsen
Mogens Hansen
| |
Michael Rasmussen (08-02-2003)
| Kommentar Fra : Michael Rasmussen |
Dato : 08-02-03 12:25 |
|
"Jason Who" <jw@nomail.here> wrote in message
news:b1vkag$1888$1@news.net.uni-c.dk...
> > Ja, det kan man sagtens gøre.
> > (Det er dog sjældent at man reelt har brug for at overskrive new)
>
> Ja. Jeg vil imidlertid gerne nemt kunne fange memoryleaks i en
eksisterende
> app. Hvis der er andre måde, udover div eksterne programmer, så hører jeg
du kan evt. kigge lidt på
http://www.flipcode.com/cgi-bin/msg.cgi?showThread=12September2000-Presentin
gAMemoryManager&forum=askmid&id=-1
- Michael
| |
Jason Who (07-02-2003)
| Kommentar Fra : Jason Who |
Dato : 07-02-03 11:39 |
|
> new kalder _aldrig_ constructoren.
> new allokerer udelukkende hukommelse.
>
> Når man skriver
> new foo;
> er det compilerens opgave først at kalde "operator new" og derefter kalde
> "foo::foo".
>
> Det er en almindelig misforståelse at new implicit kalder constructoren
> eller constructoren implicit kalder new - men sådan er det ikke.
Ok, der er intet problem. Som du siger, så kalder compileren constructoren
efter new er brugt til at allokere hukommelse.
Hvis jeg bruger malloc, så gør compileren det ikke, men det er ligemeget
eftersom jeg netop kun bruger malloc internt i new operatoren. Udenfor
kalder jeg jo new cobjekt, og compileren gør som den skal.
Tak for at skære det ud i pap for mig.
| |
|
|