Moikka, eräs perusjuttu pitää kysyä(VB6):
Kuinka käy pidemmän päälle jos en vapauta aliohjelmassa käyttämieni dynaamisien muuttujien muistia?
Siis meinaan, että jos kutsun aliohjelmaa useita kertoja ja aina varaan muuttujalle muistipaikan (esim. "Dim Apu As Integer"), varaako jokainen aliohjelman kutsukerta uuden paikan vai meneekö entisen päälle? Kiinnostaisi tietää olenko tehnyt ohjelmistani muistia syöviä aikapommeja.
Käsittääkseni jokainen kutsukerta varaa muistia ja kun aliohjelman suorittaminen loppuu, vapauttaa se automaattisesti käyttämänsä muistin.
Tavalliset muuttujat varataan ja vapautetaan automaattisesti, eivätkä ne minusta ole millään mittapuulla dynaamisia. Myös astetta dynaamisemmat taulukot tietääkseni vapautetaan VB:ssä automaattisesti.
Dynaaminen muistinvaraus tarkoittaa yleensä sitä, että muistia varataan jollain funktiolla tai komennolla (kuten C-kielessä malloc ja monissa muissa new). En väitä vanhaa VB:tä tuntevani, mutta en muista koskaan nähneeni siinä käytettävän varsinaista dynaamista muistinhallintaa. Tärkeiden asioiden jättäminen käyttäjän käsiin ei kuulu VB:n luonteeseen.
Asian voi tarkistaa helposti: Tee funktio, jossa on monta pelkäämäsi kaltaista muuttujaa, ja aja funktiota silmukassa miljoonia kertoja. Windowsin tehtävienhallinnasta voit seurata, kuinka paljon muistia ohjelma käyttää; jos määrä ei näytä kasvavan, muuttujat mitä ilmeisimmin vapautetaan automaattisesti.
Kiitoksia!
(Jossakin viestiketjussa törmäsin sellaiseen, että muistia oli "vapautettu" ERASE komennon avulla aliohjelman lopussa. Tuli siitä mieleen että onkohan tämä todellakin välttämätöntä.)
Erillinen Erase-kutsu ei ole tarpeellinen aliohjelmassa määritellylle taulukolle.
Voit myös määritellä muuttujia staattisesti (Static Muuttuja As Long
), jolloin muuttuja luodaan ohjelman käynnistyessä ja se tuhotaan ohjelman sulkeutuessa. Esimerkiksi taulukko sitten voi säilyä tuolla tavoin kutsusta toiseen ja kyseinen taulukko on käytettävissä vain kyseisessä aliohjelmassa. Tällaisen muuttujan tyhjentäminen Erasella voi olla suotavaa, mutta sitä ei toki ole järkeä tehdä jokaisella kerralla, ainoastaan kun taulukolle ei ole enää käyttöä.
Metabolix: Juu, olit oikeassa. Tehtävienhallinnassa näkyi koko ajan about 10-15MB varaus vaikka käytin ohjelmaa jonkin aikaa. Ohjelman sulkeutuessa sen varaama muisti vapautui automaattisesti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.