ďťż

Ładny brzuch

Hej!
Mam problem ze wskaźnikami... Powiedzmy mam sobie strukturę s, alokuje sobie pamiec pod wskaźnikiem p
s *p = malloc(sizeof(s));
i jest fajnie. Teraz przekazuje ten adres jakiejs funkcji foo, np.
void foo(void *ptr);
i ta funkcja sobie coś tam robi z tą pamięcią/struktura w niej. Jak widać wskaźnik został przekazany jako argument ale dodam że potem w foo jest wywołanie np. czegoś takiego:
void destroys(s *ptr) { if (ptr) free(ptr); ptr = NULL;
Pamięc się zwalnia. I pojawia się pewien problem - niby wszystko jest ok, wycieku nie ma, lecz gdy sobie zrobie
if (p) { costam }
To kod ifa zostaje wykonany, pomimo ze zwolniłem pamięc z pod p. Problem w tym, że przekazałem sobie ten p do funkji jako parametr, a ona kolejnej i zwolniła pamięć, lecz wydaje mi się, zmienna "s *p" sama z siebie się nie zmieni, nadal będzie pamiętała adres od malloca. A więc, czy żeby wszystkie wskaźniki wskazujące na coś zostały wynullowane po zwolnieniu tego czegoś, to muszę je "ręcznie", czyli np. mieć w strukturze s tablicę wskaźników na wskaźniki na nią wskazujących i potem gdy zwalniam instancję to je nullować? Czy muszę to robić? Czy może to co opisałem nie powinno mieć miejsca i warunek IF'a nie powinien zostać spełniony? Dodam, że jeśli zechcę się odwołać do jakiegoś pola struktury z pod rzekomo zwolnionego wskaźnika, to mi się to udaje. To chyba jest tak jak z szybkim formatowaniem dysku, zwolniło tylko w menadżerze pamięci.
Użytkownik Bramborak edytował ten post 10 listopad 2008, 22:50


wystarczy ze zrobisz tak:void destroys(s **ptr) { if (*ptr) free(*ptr); *ptr = NULL; ..... //wywolanie destroys(s &p)

i bedzie smigac..

teraz w roli wytlumacznia - wskaznik to tez liczba i wyboraz sobie ze do funkcji przekazujesz wlasnie liczbe (np. int), jesli przekazesz ja przez wartosc to cokolwiek bys nie robil fizycznie na niej to nic to nie zmieni, tak samo jest ze wskaznikiem, z ta roznica, ze wszelkie modyfikacje dokonane na zawartosci (czyli takze free()) sa pamietane poza funkcja..

drugi sposob to dac po prostu NULL po zakonczeniu destroys()

Dzięki! Faktycznie deklarując wskaźnik deklaruję liczbę, ale nie myślałem że to zadziała :P

Mam pytanie - czy to ma jakiś wpływ na wydajność, jeśli przekazuję wskaźnik na wskaźnik? Na chłopski rozum to chyba tak, bo gdy przekazuje przez nowy wskaźnik to na stos musi sie nowa lokalna zmienna (kopia argumentu) zrobić dla funkcji, a tak operujemy na tej samej. A więc jeśli tak to chyb same plusy (wskaźik się nulluje no i działa szybciej :P) Pytam się bo piszę na zaliczenie Ansi C virtualną maszynę języka skryptowego z kompilatorem do bajt-codu i juz skończyłem tylko działa cholernie wolno :/ chyba 50 x wolniej niż kod w C... Zastanawiam się, czy taka optymalizacja ma sens...

nie wiem czy Cie dobrze zrozumialem, ale moim zdaniem zysk wydajnosciowy bedzie maly lub zerowy, poniewaz de facto wskaznik i tak bedzie musial byc kiedys utowrzony (jesli chcesz korzystac z takiej funkcji jaka podales), to nie jest wazne czy lokalnie czy globalnie..

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •