Portál AbcLinuxu, 13. května 2024 06:36


Dotaz: free()

Wan-To avatar 16.7.2006 19:11 Wan-To | skóre: 16 | blog: WanBlog | Čelákovice
free()
Přečteno: 71×
Odpovědět | Admin
Dobrý den,

měl bych jeden dotaz ohledně C funkce free(). Jak pozná, kolik bajtů paměti má uvolnit? Vždyť jí předávám jako parametr jen počáteční adresu bloku v paměti, ale ne jeho délku.

Moc díky za vysvětlení,

Martin
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

16.7.2006 19:18 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: free()
Odpovědět | | Sbalit | Link | Blokovat | Admin
Obvyklá implementace je taková, že když voláte malloc(), alokuje se o trochu větší blok, na začátek se zapíše jakási hlavička (u glibc AFAIK 8 byte) a pointer, který dostanete, ukazuje až za ni. Funkce free() pak odečte délku té hlavičky a tam najde vše potřebné. Proto je tak riskantní volat free() na pointer, který nebyl získán pomocí malloc() (nebo jeho sourozenců).
Bluebear avatar 16.7.2006 19:55 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: free()
Taky by bylo možné, že si systém (resp. glibc) uchovává adresy a k nim odpovídající délky v nějaké tabulce. Asi se to moc nepoužívá, ale šlo by to :-)

Podobný problém v C++ (uložení počtu objektů při alokování pole) se popisuje v The C++ FAQ:

Short answer: Magic.

Long answer: The run-time system stores the number of objects, n, somewhere where it can be retrieved if you only know the pointer, p. There are two popular techniques that do this. Both these techniques are in use by commercial-grade compilers, both have tradeoffs, and neither is perfect. These techniques are:

* Over-allocate the array and put n just to the left of the first Fred object.

* Use an associative array with p as the key and n as the value
To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.