Co oznacza „podwójne wolne”?

Jak sugeruje tytuł, jestem nowy w C i wkrótce nadchodzi średniookresowy. Obecnie przeglądam z poprzednich artykułów i powtarzającym się tematem jest podwójny darmowy problem. Rozumiem, że to proces dzwonieniafree() w tym samym miejscu pamięci dwa razy, ale mam kilka pytań, na które nie jestem w 100% pewien, jak odpowiedzieć:

Pytanie 1: Jaki jest wynik podwójnego wolnego w C i dlaczego jest to taki problem?

Spowoduje to podwójne zwolnienie:

char* ptr = malloc(sizeof(char));

*ptr = 'a';
free(ptr);
free(ptr);

Moja odpowiedź na to będzie, czy zwróci adres pamięci 0x0 i spowoduje niestabilność / awarię systemu. Również, jeśli dobrze pamiętam, podwójny darmowy może faktycznie zadzwonićmalloc dwa razy, co powoduje przepełnienie bufora, przez co system jest podatny na ataki.

Jaki byłby najlepszy sposób na krótkie podsumowanie tego pytania?

Pytanie 2: Opisz sytuację, w której szczególnie łatwo jest wprowadzić podwójne wolne w C?

Zastanawiałem się, kiedy omijając wskaźniki, możesz przypadkowo zwolnić je w jednej funkcji, a także zwolnić ponownie, nie zdając sobie z tego sprawy?

Ponownie, jaki jest „najlepszy” sposób podsumowania?

questionAnswers(4)

yourAnswerToTheQuestion