Toon posts:

[C++] Garbage collecting?

Pagina: 1
Acties:

Verwijderd

Topicstarter
C++:
1
2
3
4
5
  char * test1 = new char [10];
  strcpy( test1, "testen");

  char * test2;
  test2 = _strdup ( test1 );


bvb: (op mijn PC)
test1 = 0x00300050
test2 = 0x00301FE0

Stel nu dat er niets gedaan word met t2. Word de geheugenplek (_strdup reserveert geheugen ja toch?) vrijgegeven op het einde van de scope ja dan nee?

Verwijderd

dit vind ik zelf ook nog vaagheid.. ik kan hier geen antwoord op geven en daar baal ik van :) als iemand hier eens een goeie uitleg over kan posten.. graag ! :)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Uit de f*cking manual:
"Because _strdup calls malloc to allocate storage space for the copy of strSource, it is good practice always to release this memory by calling the free routine on the pointer returned by the call to _strdup."

Dus: nee, je moet het geheugen zelf vrijgeven. 'test1' wordt wel automatisch geremoved, want dat is een local var. Je code is wel opgebouwd met de basiselementen van bufferoverflows, dus ik zou je toch willen adviseren om naar de std te kijken en dan naar de 'string' class. Je kunt ook StdString downloaden van codeguru.com, is een stringclass die de MFC string class nadoet, alleen dan zonder MFC ;)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Is er een mogelijkheid om memory leaks te detecteren in je programma?
Of bestaan er programma's waarmee je jouw programma kan opstarten die dan constant het geheugen gebruik in de gaten houden?

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
EfBe schreef op 19 February 2003 @ 13:18:
Uit de f*cking manual:
"Because _strdup calls malloc to allocate storage space for the copy of strSource, it is good practice always to release this memory by calling the free routine on the pointer returned by the call to _strdup."

Dus: nee, je moet het geheugen zelf vrijgeven. 'test1' wordt wel automatisch geremoved, want dat is een local var. Je code is wel opgebouwd met de basiselementen van bufferoverflows, dus ik zou je toch willen adviseren om naar de std te kijken en dan naar de 'string' class. Je kunt ook StdString downloaden van codeguru.com, is een stringclass die de MFC string class nadoet, alleen dan zonder MFC ;)
Ook test1 moet je zelf freeen.
Test1 is een pointer en alleen die pointer wordt opgeruimd.
C en C++ hebben geen garbage collection.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 19 February 2003 @ 13:24:
Is er een mogelijkheid om memory leaks te detecteren in je programma?
Of bestaan er programma's waarmee je jouw programma kan opstarten die dan constant het geheugen gebruik in de gaten houden?


ja, MSVC++ heeft er functies voor (weet uit mijn hoofd even niet welke overigens, moet je even in de MSDN zoeken), en er is ook nog Rational Purify, wat een heerlijk programma is dat bij geheugen-fouten (lekken, dubbel-vrijgegeven geheugen) laat zien waar de fout optreedt, en waar/wanneer het gealloceerd is. Vooral die laatste is extreem nuttig. Heerlijk programma, de vraag is alleen of je er het geld voor over hebt ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
EfBe schreef op 19 February 2003 @ 13:18:
Je kunt ook StdString downloaden van codeguru.com, is een stringclass die de MFC string class nadoet, alleen dan zonder MFC ;)
Je kunt ook std::string gebruiken, die zit gewoon bij je compiler. Ook bij je Borland compiler, en je GCC compiler, en zelfs bij de Cray compiler

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Als je wilt dat geheugen alleen binnen een zekere scope geldig is, kun je beter gebruik maken van strings (voor character arrays) en vectors (voor alle andere arrays). Dit is trouwens geen garbage collection.

Microsoft Visual C++ laat bij het afsluiten in debug mode zien welke stukken geheugen er niet vrijgegeven zijn. Hoe je dat moet configureren weet ik niet; het werkt vaak 'standaard' bij mij, maar soms ook weer niet. :)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
OlafvdSpek schreef op 19 februari 2003 @ 13:26:
Ook test1 moet je zelf freeen.
Test1 is een pointer en alleen die pointer wordt opgeruimd.
C en C++ hebben geen garbage collection.
Ja je hebt gelijk, het is ook alweer een tijdje geleden :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
OlafvdSpek schreef op 19 February 2003 @ 13:26:
[...]

Ook test1 moet je zelf freeen.
Test1 is een pointer en alleen die pointer wordt opgeruimd.
C en C++ hebben geen garbage collection.
Dat hangt van je implementatie af; en op een heleboel implementaties kun je een garbage collector toevoegen: Boehm conservatie Garbage collector
Evengoed is dat vrijwel altijd overbodig met moderne C++ libraries, zoals bijvoorbeeld de STL.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

MSalters schreef op 19 February 2003 @ 13:48:
[...]

Je kunt ook std::string gebruiken, die zit gewoon bij je compiler. Ook bij je Borland compiler, en je GCC compiler, en zelfs bij de Cray compiler


dat zei ie ook:
EfBe schreef op 19 February 2003 @ 13:18:
Je code is wel opgebouwd met de basiselementen van bufferoverflows, dus ik zou je toch willen adviseren om naar de std te kijken en dan naar de 'string' class. Je kunt ook StdString downloaden van codeguru.com, is een stringclass die de MFC string class nadoet, alleen dan zonder MFC ;)
;)

.edit: verduidelijkt speciaal voor OlafvdSpek :*

[ Voor 7% gewijzigd door .oisyn op 19-02-2003 14:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
.oisyn schreef op 19 februari 2003 @ 14:09:

[...]


dat zei ie ook:
[...]


;)
StdString (van codeguru) en std::string lijken mij niet dezelfde.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

OlafvdSpek schreef op 19 February 2003 @ 14:13:
StdString (van codeguru) en std::string lijken mij niet dezelfde.

offtopic:
Dat staat er toch ook niet? ;)
Ze worden beide als optie gegeven

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Sorry, mijn fout. Ik keek alleen naar dat stukje dat MSalters gequote had en niet naar de hele quota van .oisyn.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 19 February 2003 @ 13:15:
dit vind ik zelf ook nog vaagheid.. ik kan hier geen antwoord op geven en daar baal ik van :) als iemand hier eens een goeie uitleg over kan posten.. graag ! :)
Niks vaags aan. Je moet gewoon altijd alles handmatig vrijgeven in C en C++ want er is geen garbage collection. Tenzij het op de stack staat zoals die pointers in de code, die hoef je niet vrij te geven. De objecten waar die pointers naar wijzen echter vanzelfsprekend wel, want die staan niet op de stack.

Professionele website nodig?


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Heh :) Ik gaf met opzet beide opties, want sommige mensen zijn wat huiverig voor de std en al die templates en kiezen liever voor een no-nonsense class die net zo werkt als de classes die ze zelf ook maken. De StdString class van Joe OLeary is wel een volledige, ik weet niet of hij meer opties kent dan de std::string class, de format methods zijn iig wel prettig :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
curry684 schreef op 19 February 2003 @ 15:25:
[...]

Niks vaags aan. Je moet gewoon altijd alles handmatig vrijgeven in C en C++ want er is geen garbage collection. Tenzij het op de stack staat zoals die pointers in de code, die hoef je niet vrij te geven. De objecten waar die pointers naar wijzen echter vanzelfsprekend wel, want die staan niet op de stack.
Dat klinkt wel er dramatisch, en gelukkig is het niet zo erg. Alles wat op de stack staat wordt opgeruimd, en alles wat door de destructors van stack objects wordt opgeruimd ook. Dat is precies hoe een std::string werkt, die ruimt niet alleen de char* pointer op die echt op de stack staat, maar ook de tig-duizend chars die ergens anders staan.
En als er geen bestaande class is met een dtor die dat voor je doet, dan kun je de ScopeGuard class gebruiken en een willekeurige functie als opruimfunctie gebruiken. (te vinden op cuj en google)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

curry684 schreef op 19 februari 2003 @ 15:25:

Niks vaags aan. Je moet gewoon altijd alles handmatig vrijgeven in C en C++ want er is geen garbage collection. Tenzij het op de stack staat zoals die pointers in de code, die hoef je niet vrij te geven. De objecten waar die pointers naar wijzen echter vanzelfsprekend wel, want die staan niet op de stack.
En een static global dan? ;)

  • decipherer
  • Registratie: Februari 2002
  • Laatst online: 12:33
OlafvdSpek schreef op 19 February 2003 @ 13:26:
[...]

Ook test1 moet je zelf freeen.
Test1 is een pointer en alleen die pointer wordt opgeruimd.
C en C++ hebben geen garbage collection.
Nou ben ik nogal C++ noob, maar zou iemand eens kunnen vertellen hoe je test1 moet freeen ? Kan je daar ook gewoon free voor aanroepen, of gaat dat toch anders ?

De beste ideeën komen als je bezig bent.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

delete[] test1;
staat in je manual

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

MSalters schreef op 19 February 2003 @ 16:53:
Dat klinkt wel er dramatisch, en gelukkig is het niet zo erg.
Beter te dramatisch dan 2Gb memoryleaks :P
Alles wat op de stack staat wordt opgeruimd, en alles wat door de destructors van stack objects wordt opgeruimd ook. Dat is precies hoe een std::string werkt, die ruimt niet alleen de char* pointer op die echt op de stack staat, maar ook de tig-duizend chars die ergens anders staan.
Dat is toch exact wat ik zeg: de stack ruimt de class op, en die class ruimt vervolgens zelf expliciet al z'n allocated resources op afgezien van de members zelf, maar die staat impliciet op de stack van de parent container.

En zo :z

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

[message=17070019,noline]Zoijar schreef op 19 februari 2003 @ 16:55
En een static global dan? ;)
Staat op de static global 'stack' en wordt dus automatisch opgeruimd zodra de 'globale context' oftewel het programma afgesloten wordt. ;)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 19 February 2003 @ 17:30:
[...]

Staat op de static global 'stack' en wordt dus automatisch opgeruimd zodra de 'globale context' oftewel het programma afgesloten wordt. ;)


Ik vraag me af in hoeverre je daarop kunt vertrouwen. Bij msvc++ worden de globale destructoren bijvoorbeeld niet aangeroepen, of het nou een 'nette' afsluiting is of niet

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
.oisyn schreef op 19 februari 2003 @ 17:33:
Ik vraag me af in hoeverre je daarop kunt vertrouwen. Bij msvc++ worden de globale destructoren bijvoorbeeld niet aangeroepen, of het nou een 'nette' afsluiting is of niet
Welke versie(s)?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Rukapul
  • Registratie: Februari 2000
  • Laatst online: 23-08 14:24
Verwijderd schreef op 19 February 2003 @ 13:24:
Is er een mogelijkheid om memory leaks te detecteren in je programma?
Of bestaan er programma's waarmee je jouw programma kan opstarten die dan constant het geheugen gebruik in de gaten houden?
Zelf gebruik ik met genoegen Boundschecker om memory leaks te vinden. Het werkt als plugin in Visual Studio.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker



Mja, nu begin ik toch aan mezelf te twijfelen eigenlijk. Ik heb het een keer getest, met 7.0 als ik me niet vergis, maar dat deed ik door een output te doen naar cout. Ik bedenk me ineens dat dat wel eens niet ging werken omdat cout misschien al gedestruct was. Er zit wel een destructor section in een msvc++ object file, dus het lijkt me stug dat die dan niet gebruikt wordt idd.

Kan het nu helaas niet testen (door een debug breakpoint in een destructor te zetten), m'n pc staat afgekoppeld tegen de muur (ben bij m'n vriendin ingetrokken, en we hebben nog niet echt ruimte gemaakt enzo :P)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

VC6 en VC7 iig wel (getest door ondergetekende).

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

7.1 ook
mijn testopstelling was dus waarschijnlijk gewoon niet goed, zoals ik al vermoedde in mijn vorige post

dan heb ik niets gezegd :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 19 februari 2003 @ 13:24:
Is er een mogelijkheid om memory leaks te detecteren in je programma?
Of bestaan er programma's waarmee je jouw programma kan opstarten die dan constant het geheugen gebruik in de gaten houden?
BCB heeft er 1 ingebouwd vanaf versie 5. Aan te zetten in de Project Options van je project.

We adore chaos because we like to restore order - M.C. Escher


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LordLarry schreef op 21 February 2003 @ 13:32:
BCB heeft er 1 ingebouwd vanaf versie 5. Aan te zetten in de Project Options van je project.
Wellicht vriendelijk om erbij te vermelden dat je het tabje 'CodeGuard' zoekt en daar alles aan moet vinken :)

Niet vergeten bij releasebuild uit te zetten, en het windowtje 'CodeGuard Errors' te bekijken als de app spontaan stilvalt.

Professionele website nodig?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dankje voor het aanvullen curry684, ik heb hier niet BCB bij de hand dus ik kon het niet met zekerheid zeggen.

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1