Ero sivun ”Muistivuoto” versioiden välillä
Siirry navigaatioon
Siirry hakuun
[arvioimaton versio] | [arvioimaton versio] |
Poistettu sisältö Lisätty sisältö
pEi muokkausyhteenvetoa |
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 |
'''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]] |
||
[[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; }