Ero sivun ”Muistivuoto” versioiden välillä

Wikipediasta
Siirry navigaatioon Siirry hakuun
[arvioimaton versio][arvioimaton versio]
Poistettu sisältö Lisätty sisältö
Civ (keskustelu | muokkaukset)
Ei muokkausyhteenvetoa
Thijs!bot (keskustelu | muokkaukset)
Rivi 27: Rivi 27:
[[Luokka:Ohjelmointi]]
[[Luokka:Ohjelmointi]]


[[ar:تسرب الذاكره]]
[[de:Speicherleck]]
[[de:Speicherleck]]
[[en:Memory leak]]
[[en:Memory leak]]

Versio 28. elokuuta 2006 kello 07.46

Muistivuoto on ohjelmoinnin tyypillisimpiä virheitä. Tällä tarkoitetaan muistin varausta ohjelmakoodissa ilman muistin vapauttamista. Kun muistivuotoa sisältävää ohjelman osaa suoritetaan riittävän monta kertaa, voi vapaa muisti loppua, mikä aiheuttaa ohjelmiston kaatumisen. Joissakin ohjelmointikielissä, kuten Javassa, on automaattinen roskienkerääjä, joka pyrkii vapauttamaan ohjelmiston varaamia resursseja ohjelman uusiokäyttöön. Tällaista roskienkerääjää ei ole kuitenkaan esimerkiksi C:ssä ja C++:ssa.

Ongelman välttäminen

Muistivuodon havaitsemista varten voidaan tehdä testiohjelma, joka suorittaa jotakin funktiota useita kertoja peräkkäin. Jos ohjelma kaatuu koko ajan samassa suoritusvaiheessa, saatetaan havaita muistivuotoa aiheuttava koodin ongelmakohta.

Yksinkertainen C-kielinen esimerkki

Tämä ohjelma havainnollistaa muistivuotoa.

int main(void)
{
   char *string1 = malloc(sizeof(char)*50);
   char *string2 = malloc(sizeof(char)*50);
   scanf("%s", string2);
   string1 = string2; 
             /* Tässä string1:n varaama muisti kadotetaan.
             *  Se ei osoita mihinkään muistialueeseen,
             *  joten sitä ei voida eksplisiittisesti vapauttaa.
             */
   free(string2); /* Tämä toimii. */
   free(string1); /* Muistivuoto! Yritetään vapauttaa muistia 
                     joka on jo kertaalleen vapautettu. */
   return 0;

}