Toon posts:

[C++] geheugen cleanup

Pagina: 1
Acties:

Verwijderd

Topicstarter
C:
1
2
3
4
5
int main( void )
{
  int * i = new int;
  return 0;
}


Als ik dit programmaatje heb. Dat gaat natuurlijk sizeof(int) leaken... Nu beweert mij iemand dat die int wordt gecleaned wanneer het programma eindigt.

Nu ben ik daar zelf niet 100% zeker van, daarom wou ik even vragen of één van jullie guru's mij hierop een vaststaande uitleg kunnen geven?

Ik vind het namelijk heel vreemd dat indien dit toch gecleaned gaat worden, dat zoveel mensen (lees: programmeurs) moeite doen om geen memleaks te hebben. Want waarom moeite doen als het OS (windows) dit toch doet?

Thanks!

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 05:56

GrimaceODespair

eens een tettenman, altijd ...

Standaard worden nieuwe pointers worden op een heap gegooid die aan het einde van je programma weer vrijgegeven wordt.

Maar het is bad practice om pointers te laten rondslingeren. Ze kunnen immers alleen maar tegen je gaan werken. Als ooit je programma 100Mb geheugen vreet, kan je gaan zoeken waarom.

[ Voor 45% gewijzigd door GrimaceODespair op 14-09-2004 08:13 ]

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • Terranca
  • Registratie: April 2000
  • Laatst online: 13-05 22:23
Ben helaas (nog) geen guru ;) maar uit mijn ervaring blijkt dit inderdaad het geval. Helaas sluit niet elke applicatie zich na een paar minuten, maar zijn er ook programma's die 24/7 moeten gaan draaien. Een memory-leak kan er dan natuurlijk voor zorgen dat die programma's helemaal in de soep gaan draaien. Dus het beste is gewoon jezelf de verantwoordelijkheid aanleren om die dingen goed op te blazen, dan heb je zoiezo nergens last van :)

Verwijderd

Verwijderd schreef op 14 september 2004 @ 07:58:
Ik vind het namelijk heel vreemd dat indien dit toch gecleaned gaat worden, dat zoveel mensen (lees: programmeurs) moeite doen om geen memleaks te hebben. Want waarom moeite doen als het OS (windows) dit toch doet?
Het klopt dat windows alles toch weggooid. Je hele heap wordt in een keer weggegooid. Is een stuk sneller dan zelf al je objecten weggooien. Maar...

Vaak bevatten objecten destructoren. Deze worden niet uitgevoerd als je niet zelf je objecten weggooit. Het kan zijn dat een destructor een netwerk connectie netjes moet sluiten of programma settings moet opslaan of bestanden netjes moet sluiten. Je zou natuurlijk bij kunnen houden welke objecten je wel en welke je niet met de hand weg moet gooien. Niet doen! Hier ga je fouten in maken. Kortom, alles netjes weggooien.

Verwijderd

Topicstarter
Thanks voor de antwoorden ;).

Wat ik ervan onthoud is dat dit niet zo een erge memleak is, omdat de pointer gecreeerd werd op de heap. En dat dit toch zowiezo wordt weggesmeten als het programma afsluit.

Verwijderd

Verwijderd schreef op 14 september 2004 @ 09:05:
Thanks voor de antwoorden ;).

Wat ik ervan onthoud is dat dit niet zo een erge memleak is, omdat de pointer gecreeerd werd op de heap. En dat dit toch zowiezo wordt weggesmeten als het programma afsluit.
Maar wat als dit programma niet zo simpel is, stel je moet een behoorlijk grote allocatie meerdere keren uitvoeren afhankelijk van hoe lang het programma draait oid. Dan blijven die dingen gewoon geheugen in beslag nemen, waardoor je uiteindelijk het geheugen vol laat lopen. Dus als je je aanleert alles weer weg te gooien, blijf je efficient met het geheugen omgaan.

Meer in de strekking van 2 posts boven mij, maar uit je post bleek dat je het niet goed begreep :P

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Vergis je niet, als je een prog hebt dat langer draait, en in een grote for loop int's gaat lekken krijg je misschien ook een probleem. Gewoon zelf opschonen, dan leer je je ook de correcte methode aan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Hier is wel eens een topic over geweest. In principe is dit geen leak, nee. Het geheugen wordt immers vrij gegeven na de exit van main(). Dat het bad practice is, ja. Verder als dit in een andere functie gebeurt kan het wel een leak zijn.

Zie ook dit topic [rml][ Alg] Vraag m.b.t. memory leaks[/rml]
Die leraar heeft wel gelijk op een bepaalde manier, alleen legt hij het niet zo handig/duidelijk uit (of luisteren jullie niet goed ). Een process weet welk geheugen het heeft gealloceerd, en als het process eindigt dan zal dit worden vrij gegeven. Stel dat je nu bv een singleton object hebt dat is gealloceerd op de heap, dan hoef je dat niet vrij te geven aan het eind van je programma; puur vanuit memory leak oogpunt. Dat is dan ook feitelijk geen (resource) leak.

Dit neemt niet weg dat je vaak toch wel het object had willen destructen, bv om caches te flushen, connecties graceful te closen, etc. Dus dan wijst een 'leak' van dit soort vaak toch op een fout. Maar het hoeft dus niet per se.

Garbage collection is iets wat het runtime system doet. Je kijkt op bepaalde tijden of je draaiende programma nog mogelijkheden heeft om bij stukken geheugen te komen. En als dat niet zo is kan je ze vrij geven.

[ Voor 69% gewijzigd door Zoijar op 14-09-2004 11:00 ]

Pagina: 1