Hei,
C sovellukseni syö muistia enkä löydä siihen syytä! siis ohjelmani on jatkuvassa-silmukassa oleva ohjelma joka pollailee mm. hakemistoa.
pari vuorokautta päälläoltuaan koneesta loppuu muisti, missä siis voisi olla vika!? en käytä dynaamista muistin varausta eli ne missään kohtaa varaa new operaattorilla muistia mikä pitäisi vapauttaa, siksi juuri tämä ihmetyttää!
onko mahdollisesti seuraavissä käskyissä jotain joka voisi olla syypää tähän? memset, memcpy, _unlink..? pitäisikö korvata memset ja memcpy esim for-silmukalla?
C sovellukseni syö muistia enkä löydä siihen syytä! siis ohjelmani on jatkuvassa-silmukassa oleva ohjelma joka pollailee mm. hakemistoa.
pari vuorokautta päälläoltuaan koneesta loppuu muisti, missä siis voisi olla vika!? en käytä dynaamista muistin varausta eli ne missään kohtaa varaa new operaattorilla muistia mikä pitäisi vapauttaa, siksi juuri tämä ihmetyttää!
onko mahdollisesti seuraavissä käskyissä jotain joka voisi olla syypää tähän? memset, memcpy, _unlink..? pitäisikö korvata memset ja memcpy esim for-silmukalla?
Vastaukset 6
Vanhimmat
memset - ei
memcpy - ei
_unlink - ei
for-silmukka - ei todellakaan!
Mitähän muuta ohjelmasi tekee? C :n kanssa pitää olla tarkkana, kun kääntäjä tekee niin paljon pyytämättäsi....
"joka pollailee mm. hakemistoa."
Käytät ilmeisesti Win32 FindFirstFile kutsua ?
muistitko FindClose kutsun kun olet käynyt kaikki läpi. FindFirst on "melkein" sama kuin muistin varaus. Käy lisäksi läpi kaikki API kutsut jos palauttavat Handleja jne (=> FreeHandle), ts dynaamisesti varattua muistia.
en käytä findclosea että oiskohan siinä silloin vika..!? täytyy tutkia, eli if(findfirst())
ja kun löytyy niin findclose vai? miten sen tulisi toimia?
Kannattaa varmaankin tehdä sen if (findfirst):n sijasta mieluumin jotakuinkin näin:
HANDLE hFind = FindFirstFile(....);
sitten testaat:
if (hFind != INVALID_HANDLE_VALUE)
...
ja lopuksi sitten
FindClose(hFind);
Pikku tarkennus samantien: FindClose tehdään aina riippumatta saadusta handlen arvosta.
- pollaus alkaa
if (findfirst
{
while ( findnext )
}
findclose();
// vapauta puskurit aina riipumatta mitä tapauhtui.
- pollaus loppuu
Mielenkiintoista on että useimista esimerkeistä tuo puuttuu..
Description
findclose closes any handles and frees up any dynamic memory associated with previous calls to findfirst and findnext.