TIniFile, waarom delete?

Status
Niet open voor verdere reacties.

runtime error

Gebruiker
Lid geworden
14 apr 2010
Berichten
5
Ik ben een programma aan het schrijven met borland c++ builder.
In mijn programma wil ik gebruik maken van .ini files. ik heb dit al eens eerder gedaan, en het werkt allemaal perfect.
Ik heb het op twee manieren gedaan. 1e is exact volgens de examples, 2e is mijn eigen improvisatie. in manier twee heb ik zoals hieronder te zien, géén "delete ini" gedaan. met een file monitor zag ik totaal geen verschil, dus mijn vraag is, waar dient de "delete" functie voor?


Manier 1:
[CPP]#include <inifiles.hpp>
#include "Unit1.h"

//---------------------------------------------------------------------------
void __fastcall TForm1::btnIniClick(TObject *Sender)
{
TIniFile *MyIni = new TIniFile(ChangeFileExt("dir\\file", ".ini" ) );
MyIni -> WriteString ("Section1", "Item1", "value");
MyIni -> WriteInteger("Section2", "Item1", 35);
delete ini;// wat gebeurd er als ik dit niet doe?
}[/CPP]

Manier 2:
[CPP]#include <inifiles.hpp>
#include "Unit1.h"

TIniFile *MyIni = new TIniFile(ChangeFileExt("dir\\file", ".ini" ) );
//---------------------------------------------------------------------------
void __fastcall TForm1::btnIniClick(TObject *Sender)
{
MyIni -> WriteString ( "Section1", "Item1", "value");
MyIni -> WriteInteger("Section2", "Item1", 35);
}[/CPP]

(als je je afvraagt waarom ik manier 2 wil, ik ga nogal veel verschillende dingen in een ini file lezen en schrijven. bij manier 1 zou ik dan een aparte functie aan moeten maken, en mee moeten geven welke items ik wel en niet wil overschrijven enz. enz. met manier 2 heb ik slecht 1 regeltje [ini -> WriteInteger("Section", "Item", "Value");] lot easier! )
 
Kort: delete doet je new teniet.

Iets Langer:
Wanneer je een object aanmaakt met new, reserveer je op de heap (een stuk RAM-geheugen) genoeg plaats om dat object in op te slaan (een aantal bytes dus). Hoeveel dat er juist zijn kan je nagaan met sizeof(objectType).
In je programma zelf gebruik je echter enkel de pointer naar dat object, die meestal veel kleiner is, en dus sneller om als argument/parameter aan een functie mee te geven.

Wat delete doet is dat gereserveerde geheugen terug vrijgeven. Wel: eigenlijk roept delete eerst de destructor van het object aan (als je classes kent, heb je hier vast al van gehoord) en markeert het gereserveerde geheugen daarna als beschikbaar.

Wanneer dat niet gebeurt heb je een memory leak: Er is namelijk een stukje geheugen dat niet beschikbaar komt voor het OS/andere programma's of zelfs je eigen programma en waar niemand nog veilig aankan!


Meer info (Engels) kan je vinden op WikiPedia en cplusplus.com.
 
oké duidelijk.

wanneer ik dus een new object zou aanmaken bij buttonClick zonder daarna te deleten, zou ik bij iedere buttonClick een nieuw stukje geheugen reserveren. niet handig.

maar dan weer even terug naar mijn situatie;
Ik maak mijn nieuwe object eenmalig aan bij het starten van het programma. loop ik dan ook risico op een memory leak? (er wordt dan toch ook maar één keer een stukje geheugen gereserveerd? )
 
Normaalgesproken loop je nog steeds kans op een memory leak, alleen niet meer als gevolg van je btnIniClick functie.

Als je helemaal in het begin van je programma eenmalig geheugen reserveert, is het de bedoeling dat je dat geheugen dan ook weer vrijgeeft als jij het niet langer meer nodig hebt (zoals bvb op het einde van je programma).

Nu is het wel zo dat de garbage collector van elk OS dit meestal wel opvangt, en al het geheugen dat door een bepaald programma gereserveerd werd dan vrijgeeft als het proces/programma niet langer bestaat. Het nadeel hieraan is dat dit met een lichte vertraging gebeurt én dat je er eigenlijk niet mag op rekenen dat iemand/iets anders jouw 'rommel' wel zal opruimen.
 
Geweldig, het is me helemaal duidelijk.

en wat het opruimen van mijn rommel betreft, dan geef ik het geheugen gewoon vrij on FormClose. Het ging mij er vooral om of het kwaad kon zolang het programma is running.

Bedankt voor de duidelijke uitleg! :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan