Skocz do zawartości

algorytm przeszukiwania dysku-pamięć


Nightowl

Recommended Posts

Witam wszystkich. Mam taki problem : używam zamieszczonego na stornie algorytmu przeszukiwania dysku i wszystko jest ok poza tym, że funkcja po zakończeniu się, nie zwalnia pamięci, którą wykożystała. Chodzi mi dokładnie o to że po każdym wywołaniu tej funkcji mój program zajmuje coraz więcej pamięci (dokładnie 400 kb) i po kilkunastu wywołaniach program zajmuje mi ok 10Mb ramu. :( .
Żeby rozjaśnić wszystkie niejasności to wklejam też ten kawałek kodu przeszukiawania:

void szukaj1(char *curdir,int *ile){
WIN32_FIND_DATA wfd;
BOOL IsFile = TRUE;
HANDLE hFile;
char path[200];
SetCurrentDirectory(curdir);
hFile = FindFirstFile("*.*", &wfd);
while (IsFile) {
GetFullPathName(wfd.cFileName, 199, path, NULL);
if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && Name[0] != '.')){
(*ile)++;
szukaj1(path ,ile);
}
IsFile = FindNextFile(hFile, &wfd);
}
if (curdir[0] > 3) SetCurrentDirectory("..");

}
wkaźnik int * ile służy mi do zliczania katalogów.

Link do komentarza
Udostępnij na innych stronach

Jako autor arta czuję się zobowiązany do odpowiedzi ;). Funkcja nie alokuje żadnej pamięci na stałe (przy użyciu operatora new lub funkcji malloc) dlatego cała tymczasowa pamięć jaką wykożystuje (wszytkie lokalne zmienne) jest zwalniana natychmiast po zakończeniu funkcji a podczas wykonywania jej objętość zwiększa się jak wiadomo z powodu rekurencji która cały czas musi zapamiętywać pewne przekazywane do niej dane. Dobrze by było gdybyś podał jakiego używasz systemu, bo pod XP-kiem u mnie wszystko jest zwalniane i TaskManager pokazuje odrazu po zakończeniu początkową ilość pamięci.

Link do komentarza
Udostępnij na innych stronach

Witam.
Wiem właśnie że tak powinno być, jak piszesz ale u mnie to tak nie działa i nie wiem dlaczego. Też pracuje pod xp. Jeśli u ciebie jest wszystko w pożądku to znaczy że ja coś robie nie tak( może coś w ustawieniach kompilatora). Bede sie z tym bawił. Albo spróbuje skompilować pod innym kompilatorem. Narazei wygląda u mnie to tak że on sobie wszystkie nazwy plików odkłada gdzieś na stosie i sie go później nie pozbywa.
Jak sobie z tym nie poradze to bede cie "męczył" dalej.

Narazie.

Link do komentarza
Udostępnij na innych stronach

Wybadałem o co chodzi. Stwożyłem nową funkcję :
int fun(void){

long double *t; t=new long double[100000];
long double *tt; tt=new long double[100000];
long double *ttt; ttt=new long double[100000];

//delete [] t;
//delete []tt;
// delete[] ttt;
return 0;
}
Jak ją wywołuję w main() tak jak ona teraz wygląda, to zajmuje ona cały czas miejsce i kolejne wywołania jej też zajmują dodatkową pamięć. Jeżeli uruchomie instrukcje delete to funkcja zwalnia pamięć i jest wszystko ok. Prosze zrób testy u siebie i zobacz, czy nie masz podobnego efektu. Próbowałem to na 2 kompilatorach (builder 6 i dev 4.9) pod systemem xp z serwis pakiem 2.

Link do komentarza
Udostępnij na innych stronach

Testowałem i mam takie same efekty. A teraz tłumaczę dlaczego tak się dzieje. Otóż wszystko jest OK, ponieważ WinXP daje Ci pamięć przez Ciebie rezerwowaną i pomimo że nie jest ona po wywołaniu funkcji używana to on zostawia ją jakgdyby na zapas, żeby później nie musiał przydzielać od nowa. Ale możesz być pewny że jak mu tam pamięc będzie potrzebna do innych celów to on ją sobie na bierząco zwolni. Będzie trudno to zarezerwować bo w miarę jak mu zacznie brakować pamięci będzie rezerwował pamięć fizyczną na dysku i robił mapowanie, ale możesz być pewny jak sam widzisz że wszystko jest OK.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...