Ero sivun ”Muistivuoto” versioiden välillä
[arvioimaton versio] | [arvioimaton versio] |
Civ (keskustelu | muokkaukset) Ei muokkausyhteenvetoa |
p Botti lisäsi: ar:تسرب الذاكره |
||
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; }