Ero sivun ”Muistivuoto” versioiden välillä

Wikipediasta
Siirry navigaatioon Siirry hakuun
[arvioimaton versio][arvioimaton versio]
Poistettu sisältö Lisätty sisältö
EmausBot (keskustelu | muokkaukset)
p r2.7.2+) (Botti lisäsi: uk:Витік пам'яті
p Botti poisti 23 Wikidatan sivulle d:q751740 siirrettyä kielilinkkiä
Rivi 29: Rivi 29:
</source>
</source>
[[Luokka:Ohjelmointi]]
[[Luokka:Ohjelmointi]]

[[ar:تسرب الذاكرة]]
[[id:Kebocoran Memori]]
[[ms:Bocor ingatan]]
[[cs:Únik paměti]]
[[de:Speicherleck]]
[[en:Memory leak]]
[[es:Fuga de memoria]]
[[fa:کمبود حافظه]]
[[fr:Fuite de mémoire]]
[[ko:메모리 누수]]
[[it:Memory leak]]
[[he:דליפת זיכרון]]
[[lt:Atminties nutekėjimas]]
[[nl:Geheugenlek]]
[[ja:メモリリーク]]
[[pl:Wyciek pamięci]]
[[pt:Vazamento de memória]]
[[ru:Утечка памяти]]
[[sk:Memory leak]]
[[tr:Bellek sızıntısı]]
[[uk:Витік пам'яті]]
[[zh-yue:漏記憶]]
[[zh:内存泄漏]]

Versio 9. maaliskuuta 2013 kello 15.53

Muistivuoto on tyypillinen ohjelmointivirhe, jossa tietokoneohjelma ei vapauta varaamaansa muistia kun sitä ei enää tarvita. 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 automaattista roskienkerääjää ei ole kuitenkaan esimerkiksi C:ssä ja C++:ssa. Se voidaan toteuttaa olemassa olevilla kirjastoilla taikka toteuttaa itse ohjelman päättyessä kirjoittamalla kaikkien muuttujien päälle nollia. Muistin yli- ja alivuototilanteet on myös hyvä ottaa huomioon.

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. Olemassa olevan koodin voi myös tutkia sekä kaupallisilla, että ilmaisilla työkaluilla, esimerkiksi IBM Rational Purify, BoundsChecker, Valgrind, Insure++ ja memwatch ovat joitakin suosituimpia C- ja C++-kielen muistivuodon virheidenjäljitysohjelmia.

Muistin yli- ja alivuototilanne

Muistin ylivuototilanteessa kirjoitetaan kirjoitettavaksi tarkoitetun alueen yli, esimerkiksi kirjoittamalla kymmenen tavua viiden tavun alueelle. Muistin alivuototilanteessa sijoitetaan muuttuvaksi määritellyn alueen keskelle merkki alueen päättymisestä, minkä on tarkoitus ilmoittaa konekielisen ohjeistuksen alkamisesta.

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, 
                      ja string1:lle varattu muisti jää vapauttamatta.*/
    return 0;
 
 }