Ero sivun ”Muistivuoto” versioiden välillä

Wikipediasta
Siirry navigaatioon Siirry hakuun
[arvioimaton versio][arvioimaton versio]
Poistettu sisältö Lisätty sisältö
pEi muokkausyhteenvetoa
 
p Piste kommenttiin.
Rivi 15: Rivi 15:
/* Tässä string1:n varaama muisti kadotetaan.
/* Tässä string1:n varaama muisti kadotetaan.
* Se ei osoita mihinkään muistialueeseen,
* Se ei osoita mihinkään muistialueeseen,
* joten sitä ei voida eksplisiittisesti vapauttaa
* joten sitä ei voida eksplisiittisesti vapauttaa.
*/
*/
free(string2); /* Tämä toimii. */
free(string2); /* Tämä toimii. */

Versio 20. lokakuuta 2005 kello 00.26

Muistivuoto on ohjelmoinnin tyypillisimpiä virheitä. Tällä tarkoitetaan sitä, että ohjelmapätkä ei vapauta kaikkea varaamaansa muistia. Kun pätkää suoritetaan ohjelmassa monia kertoja, ohjelma yleensä kaatuu tietokoneen jonkun resurssin loputtua. Joissakin ohjelmointikielissä, kuten Javassa, on automaattinen roskien kerääjä joka pyrkii vapauttamaan järjestelmän resursseja ohjelman käyttöön. Tällaista roskienkerääjää ei ole kuitenkaan esimerkiksi C:ssä ja C++:ssa.

Ongelman välttäminen

Muistivuodon havaitseminen voidaan tehdä testiohjelma, joka suorittaa jotakin funktiota useita kertoja peräkkäin. Tällöin saatetaan havaita koodista ongelmakohta, jos ohjelma kaatuu koko ajan samassa suoritusvaiheessa.

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;

}