/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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.



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste