Ero sivun ”Muistivuoto” versioiden välillä

Wikipediasta
Siirry navigaatioon Siirry hakuun
[arvioimaton versio][arvioimaton versio]
Poistettu sisältö Lisätty sisältö
pEi muokkausyhteenvetoa
Jannex (keskustelu | muokkaukset)
p Wikilinkkejä
Rivi 1: Rivi 1:
'''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.
'''Muistivuoto''' on [[ohjelmointi|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 [[Java]]ssa, 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-ohjelmointikieli|C]]:ssä ja [[C plus plus|C++]]:ssa.


== Ongelman välttäminen ==
== Ongelman välttäminen ==
Rivi 24: Rivi 24:
}
}


[[Luokka:Tietotekniikka]]
[[luokka:tietotekniikka]]
[[luokka:ohjelmointi]]
[[Luokka:Ohjelmointi]]


[[de:Speicherleck]]
[[de:Speicherleck]]

Versio 23. lokakuuta 2005 kello 15.18

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 havaitsemista varten 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;

}