Wpis z mikrobloga

Za każdym razem jak widzę w nowym projekcie:

#define SAFE_FREE(var) \
if (var) {\
free(var); \
var = NULL; \

albo inny wariant



#define SAFE_FREE(var) \
do { if (*var) \
free(*var); \
*var = NULL; \
} while (0)

czuję ciarki żenady na plecach i wiem, że się będzie działo ()

#jezykc #programista15k
  • 21
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@NiebieskaPileczka no miałem 10+ lat temu

@Pan_krecik malloc i zwalnianie ok, deklarowanie wszystkich funckcjo przed implementacją też kojarzę. Nie rozumiem dlaczego OP czuje ciary żenady. Z powodu tego ze ktoś działa na pamieci co do której nie wie czy cos innego z niej nie korzysta? Co znaczy SAFE_FREE bo z tym tez sie nie spotkałem?
  • Odpowiedz
@zibizz1 ponadto..

SAFE_FREE()
Zabezpiecza cię przed zrobieniem free() na zwolnionym już wcześniej bloku pamięci.

Gdybyś zrobił free() na zwolnionej już wcześniej pamięci ...Twój program od razu wylatuje i dostajesz klasyczny error stack
  • Odpowiedz
@Pan_krecik no tak makro, debil ze mnie. Czyli w skrócie chodzi o radzenie sobie że skutkami nieumiejętnego programowania i zamiast znaleźć przyczynę to jest leczenie skutków.
  • Odpowiedz
  • 0
@Jailer już @zibizz1 (jesteś z uniwersum Javy ?) napisał o jednym z najbardziej oczywistych powodów.

@zibizz1 swoją drogą, widać exp bo żeś to rozkminił od tak.

dostajesz klasyczny error stack overflow


@Pan_krecik: Error dostajesz (przeważnie), ale raczej nie ten xD "Stack overflow" to zupełnie inna bajka.
  • Odpowiedz
  • 0
if (var) //jeśli istnieje

jakasoperacja(var);


Bez tego sprawdzenia program grozi wylotem w kosmos..bo grozi wykonaniem funkcji na losowym fragmencie pamięci..


Zaawansowany C jest trudny, ale niesamowicie wydajny i
  • Odpowiedz
@BeginEnd Głównie C# i tam wiem chyba prawie wszystko ale w innych językach kuleje, chociaż zdarzyła sie java, dart, JS, Typescript, ostatnio trochę python, a z rok temu nawet C++, było prawie tak samo mi źle w nim pisać jak z 8 lat temu w objective C. Sam w tych obcych językach szczególnie na początku robię coś żeby tylko zadziałało więc nie dziwię się że potem mozna spotkać rozne kwiatki.

Ludzie
  • Odpowiedz
@BeginEnd Dużo się nagadales i nadal nie uzasadniles co Cię ten safe_free() boli? xD

Ja nie miałem tego na rekrutacji.. nauczyłem się od starszych i bardziej doświadczonych.

Ale chętnie nauczę się czegoś od Ciebie.
  • Odpowiedz
@card_man

@BeginEnd: a po cholerę ten if jest? Przecież jak ptr jest NULL to free i tak nic nie bedzie robil? Reszta jak dla mnie może być


Ależ będzie robił. Weźmie wskaźnik że zmiennej i podejmie próbę zwolnienia zwolnionej pamięci... System w tym momencie zabije
  • Odpowiedz
  • 0
Ale chętnie nauczę się czegoś od Ciebie.


@Pan_krecik: Podobnie jak z imieniem 'Sok Z Żuka" - żeby coś zyskać musisz coś dać od siebie. Też żeby inni mieli coś z tego. Daj argument za, a ja ci zbiję albo dam argument przeciw. Pierwsza strona której skończą się argumenty napisze "pass". Akceptujesz?
  • Odpowiedz
@Pan_krecik: @Jailer mi chodzi o to że ten if jest bez sensu bo:
1) jeśli ptr jest NULL to nie ma po co go dawać, bo free robi takiego checka
2) jeśli ptr nie jest NULL, ale wskazuje na zwolnioną już pamięć, to i tak się to wywali na free bo ten if tego nie wykryje

więc wystarczy samo free + nadpisanie ptr=NULL i tyle
  • Odpowiedz