Kun prosessi jostain syystä loppuu, joko se poistuu exit(x):llä tai tulee jokin virhe yms., niin kerneli automaattisesti siivoaa käyttämättömän muistialueen pois, eli muistiresurssit eivät jää ohjelman loputtua kummittelemaan varattuina vaikka niille ei tekisikään free:tä.
Kiitos, hyvä tietää.
Miten käy jos esim malloc-funktio ei palauta muistia eikä muista tarkistaa paluu-osoitetta vaan kirjoittaa sopimattomaan paikkaan, jolloin ohjelma kaatuu. Siivoaako kerneli jäljet myös siinä tapauksessa?
Tein harjoitus-ohjelman aiheesta:
http://ajatusmylly.net/index.php?topic=1239.msg27970#msg27970
Käytetty linkattua listaa.
Tähän täytyy kommentoida kolme seikkaa:
1) Älä _koskaan_ oleta, että Kernel tekisi jotain puolestasi. Jos tekee, niin hyvä homma, mutta älä luota siihen. ->Miksi ihmeessä et käyttäisi free() funktiota virhetilanteessa itse kun ja jos voit? -ja virheenkäsittelyfunktio on sitä varten, että voi!
C-kieli on melkolailla universaali, joten et voi olettaa, että jokin muu (kuin Linux) kernel siivoaa jälkensä! Koodia voidaan portata silti lähes mille tahansa alustalle jos se on Ansia.
2) Jos "ei muista tarkistaa paluu-osoitetta vaan kirjoittaa sopimattomaan paikkaan", on alettava C-kielen lisäharjoitukset, jotta muistaa koodata tarkistukset!
3) Jos "malloc-funktio ei palauta muistia", niin ohjelmassa on virhe, joten sen täytyy hallita tilanne ja kertoa käyttäjälle tai kutsuvalle funktiolle, että nyt tehdään (esimerkiksi mahdollisesti muistin loppumisen vuoksi) exit tai palautetaan virhekoodi.
Nuo kolme edellämainittua keinoa ovat ne, joilla saadaan aikaiseksi selkeää ja bugitonta koodia.
Älä ole "java"-mies. Koodaa kuten "C"-mies, eli jos varaat muistia, niin huolehdi itse myös sen vapauttamisesta. Jos teet jotain, niin älä oleta, että joku siivoaa jälkesi.
Mikäli oletat jälkien siivoituvan automaattisesti, niin siinä tapauksessa unohda void pointterit ja castaukset, sillä ohjelma (datan vastaanottava moduli/finktio) ei välttämättä edes tiedä varausyksikön kokoa. Ja unohtamalla void pointterin käytön, menetät lähes kaiken C-kielen eduista.
Muistakaa, että C-kieli on ehdottomasti maailman joustavin, mutta samalla myös vaarallisin ja erittäin virhealtis.