Ero sivun ”Muistivuoto” versioiden välillä

Wikipediasta
Siirry navigaatioon Siirry hakuun
[arvioimaton versio][arvioimaton versio]
Poistettu sisältö Lisätty sisältö
Chlewbot (keskustelu | muokkaukset)
p robot Adding: lt
Hartz (keskustelu | muokkaukset)
p Linkin suoristus: C-ohjelmointikieli
Rivi 1: Rivi 1:
'''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 roskienkerää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++]]: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 roskienkerää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++]]:ssa.


== Ongelman välttäminen ==
== Ongelman välttäminen ==

Versio 20. helmikuuta 2006 kello 16.25

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 roskienkerää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;

}