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?
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