[C++/Qt/Linux] geheugen vrij maken

Pagina: 1
Acties:

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46
Ik heb een probleem met het weer vrijgeven van geheugen in in C++ applicatie die gemaakt is met behulp van Qt en draait op Linux. Omdat geheugenallocaties enzo, voor zover ik begrepen heb, nogal systeem-specifiek zijn zet ik dat er maar even bij :-)

Het idee dat mijn programma delen van een kaart (maptiles) laadt wanneer hij ze nodig heeft. Dat is geen probleem. Omdat het een vectorkaart is, worden de objecten opgeslagen in QLists. Steeds als er een nieuwe maptile geladen wordt, worden er objecten toegevoegd aan de QLists. Tot zover niets aan de hand.

Omdat het geheugen echter nogal beperkt is, wil ik als dat op het moment dat het geheugen van het systeem onder een bepaalde drempel komt, er weer ongebruikte tiles weggegooid worden. Dat doe ik door middel van Qlist::remove(). QList::setAutodelete(true) is daarbij gebruikt.

Op zich worden de objecten verwijderd, maar het lijkt alsof het geheugen niet vrij gegeven wordt! Als ik steeds tiles laad en weer weghaal, dan blijft het geheugengebruik groeien en het vrije geheugen afnemen. In mijn programma meet ik het laatste, en wel door de waardes in /proc/meminfo op de regels "MemFree", "Buffers" en "Cached" op te tellen. Voor zover ik uit de FAQ van NOS heb begrepen geeft dat je "echte" vrije geheugen aan. Als ik met top het geheugengebruik van mijn programma volg, dan zie ik dat steeds maar toenemen als er kaarten geladen worden maar niet afnemen als ze weer verwijderd worden.

Heeft iemand enig idee hoe ik dit probleem kan aanpakken?

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Die objecten die je verwijdert, hebben die niet ook weer resources? En geef je die wel vrij? Zonder meer info kunnen we er natuurlijk ook maar weinig over zeggen he :) Maak anders eens een klein testprogrammaatje met ditzelfde probleem en post dan hier je code

[ Voor 22% gewijzigd door .oisyn op 26-02-2004 17:02 ]

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.


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46
Die vraag is natuurlijk terecht. De objecten maken zelf geen resources aan op de heap: alle member variabelen zijn "echte" variabelen, geen pointers.
Ik zal eens kijken of ik een klein testprogramma in elkaar kan klussen. Intussen is de source van dit programma gewoon beschikbaar trouwens, het is OpenSource. Voor geïnteresseerden: http://cumulus.kflog.org/...shot/cumulus-snapshot.tbz
Het probleem zit in MapContents::unloadMaps()

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Als ik met goed herinner zal Linux nooit geheugen van een programma aan het OS retourneren. Dat is ook niet erg, want als dat geheugen eindigt gewoon als swapped-out (gebruikt dus geen fysiek geheugen).

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