Basis van programmeren in C

Wat is in C de meest passende reden waarom wordt aangeraden om direct na free(p); de regel p = NULL; te schrijven?

  1. AZonder toekenning van NULL komt het vrijgegeven gebied niet opnieuw beschikbaar, wat een geheugenlek veroorzaakt
  2. Bp blijft naar het vrijgegeven gebied wijzen, dus zo worden dubbele vrijgave en gebruik na vrijgave voorkomen en gemakkelijker gevonden
  3. Cfree zet p automatisch op NULL, maar dezelfde waarde nog eens schrijven dient als veiligheidscontrole
Antwoord en toelichting tonen

Antwoord: B. p blijft naar het vrijgegeven gebied wijzen, dus zo worden dubbele vrijgave en gebruik na vrijgave voorkomen en gemakkelijker gevonden

free(p) geeft het gebied vrij waarnaar p wees, maar de waarde (het adres) van de variabele p blijft ongewijzigd. Daarna *p lezen of schrijven is gebruik na vrijgave (use-after-free), en free(p) nog eens aanroepen is een dubbele vrijgave (double free); beide zijn ongedefinieerd gedrag en kunnen de beheerinformatie van de heap beschadigen, zodat een storing ergens ver weg optreedt. Als p op NULL wordt gezet, is de dubbele vrijgave onschadelijk, omdat vastligt dat free(NULL) niets doet, en een controle op NULL vóór gebruik brengt ook de fout aan het licht. Andere pointers die naar hetzelfde gebied wijzen, vragen nog steeds aparte aandacht.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. De string "ABCDEFGH" van 8 tekens werd aan de bovenstaande functie save doorgegeven. Wat gebeurt er?
  2. Welke beschrijving van wat er in C gebeurt als een NULL-pointer wordt gederefereerd (*p wordt gelezen terwijl p NULL is), is juist?
  3. Neem een gebruikelijke omgeving aan waarin char 1 byte en int 4 bytes is, en int op adressen wordt geplaatst die een veelvoud van 4 zijn. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
  4. uint32_t en uint8_t zijn integertypen zonder teken van 32 en 8 bits, en de omgeving is little-endian. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
  5. Wat is de uitvoer als de bovenstaande code, die 9 opslaat in een bitveld van 3 bits, wordt uitgevoerd?