Wpis z mikrobloga

#cpp #programowanie Sory, nie znalazlem tagu #c wiec pisze tez pod #cpp.. Pytanie wskaźnikowe proste. Czy to tak ma być, że po użyciu free() na wcześniejszym wskaźniku zainicjowanym malloc() dalej mogę coś wpisywać do tej struktury? Bo obecnie po użyciu free() nie mam z tym problemu i nie wywala programu w kosmos tylko normalnie przypisuje zmienne.. sytuacja się zmienia jesli dopisze potem, że moj wskaźnik = NULL; to wtedy faktycznie podczas DEBUGU mam napisane że wskaznik jest NULL a próba wpisania tam czegoś rozwala program? To jak to z tym jest? zostawić tylko free() i olać ten NULL? czy dać NULL jeszcze?
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@ZawzietyRobaczek: pamięć magicznie nie znika po użyciu free, tylko ma poprzedni stan i adres, natomiast mówi jednostce wykonawczej, że znowu może przydzielić pamięć z tego adresu, zagospodarować ją w inny sposób i wtedy jak spróbujesz na niej operować to wystąpi błąd przy dostępie do pamięci

czyli możesz, ale prędzej czy później program Ci się wywali ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@ZawzietyRobaczek: zalezy. od systemu, ustawien, etc. generalnie free() mowi jedynie "hej, nie uzywam juz tego obszaru pamieci". ale jak masz jakis pointer w kodzie to on nie wie ze wywolales free() i moze tam dalej mazac. Są rozne narzedzia i rozwiązania które pilnują by Twój kod nie wsadzał łap w obsza który zwolnił, ale jak ich nie masz albo nie używasz alb cokolwiek to nic to nie zmieni. Polecam unit
  • Odpowiedz
@Hauleth: Standard cpp mówi: "The behavior is undefined if after free() returns, an access is made through the pointer ptr (unless another allocation function happened to result in a pointer value equal to ptr)"
  • Odpowiedz
@ZawzietyRobaczek: to jest UB. Pewnie u ciebie działa, bo główną zasadą alokatora jest to, że stara się zwalniać jak najrzadziej zwalniać pamięć do systemu, bo to kosztuje. Nie można na tym polegać, bo równie dobrze tego miejsca może nie być w pamięci i dostaniesz segfaulta. Co do zerowania to dla mnie to słaby pattern. Oczywiście jak chcesz pózniej używać zmiennej to tak. Co innego jak według logiki twojego programu takiej
  • Odpowiedz