malloc/free

Pavel Hudecek edizon na seznam.cz
Čtvrtek Listopad 3 02:36:23 CET 2016


Díky.

Tohle už vypadá lépe. Po nějaké době mě totiž napadlo, že (2) vlastně nejde. 
malloc ten pointer vrací jako výsledek a nemůže tedy zjistit, kde ho budu 
mít uložený.

PH

-----Původní zpráva----- 
From: Miroslav Šinko
Dovolil by som si nesuhlasit s tym, ze moze nastavat bod 2. Aspon teda
pre pre zakladne funkcie malloc, calloc, realloc a vyraz "pointer", na
ktory bola otazka. To by znamenalo, ze pointer vrateny kniznicnou
alokacnou funkciou a ulozeny "aplikacnym" programom lubovolnym sposobom
by casom mohol stratit platnost. Norma hovori nasledovne:

7.20.3 Memory management functions
1 The order and contiguity of storage allocated by successive calls to
the calloc, malloc, and realloc functions is unspecified. The pointer
returned if the allocation succeeds is suitably aligned so that it may
be assigned to a pointer to any type of object and then used to access
such an object or an array of such objects in the space allocated
(until the space is explicitly deallocated). The lifetime of an
allocated object extends from the allocation until the deallocation.

T.j. pointer ukazuje na objekt a zivotnost objektu trva az do dealokacie.

Existuju implementacie, kde je umoznene "nejakemu spravcovi"
preusporiadavat alokovane bloky pamati a tym aj menit hodnotu pointera,
ale aj tam existuje "pevny bod" na pristup k pamati a aplikacnym
programom urcovana doba platnosti pointera, t.j. nemoze byt len tak
zneplatneny kniznicou na pozadi.
Napr. WinAPI funkcia GlobalAlloc pri pouziti flagu GMEM_MOVEABLE vracia
handle (to je ten peny bod, ktoreho hodnota sa nemeni) a nie pointer.
Ten sa ziska az naslednym volanim GlobalLock. Dokym sa nezavola
GlobalUnlock, je pointer platny. Mimo zamknutia si moze spravca pamati
alokovany blok presunut ako potrebuje. Teda po dalsom volani GlobalLock,
so stale platnym handlom, moze vratit iny pointer.

miro


On 3.11.2016 1:40, Jan Waclawek wrote:
> Vsetky tri. Je to vec pouzitej kniznice.
>
> wek
>
>
>
> ----- Original Message ---------------
>> Dobrý den v¹em,
>>
>> mìjme program v C, bì¾ící v MCU s nìkolika desítkami kB RAM.
>>
>> Program èas od èasu alokuje nìjakou pamì» a jindy zas odalokuje.
>> Pøedpokládejme, ¾e se alokují kousky od nìkolika B a¾ do nìkolika kB.
>> Alokace a dealokace se dìjí v obecnì náhodném poøadí, tedy rùzné kousky
>> pamìti jsou alokovány na rùznou dobu.
>>
>> 1. Mù¾e se stát, ¾e se pamì» postupnì fragmentuje tak, ¾e od jistého
>> okam¾iku ji¾ nepùjde alokovat nìjaké vìt¹í kousky, pøesto¾e celkové místo 
>> by
>> bohatì staèilo?
>> 2. Pokud se nedìje (1), mù¾e se stát, ¾e nìjaký správce pamìti bude v
>> prùbìhu èasu ji¾ alokované kusy v pøípadì nutnosti pøesouvat, tak¾e se 
>> budou
>> mìnit hodnoty pointerù na nì ukazujících?
>> 3. Nebo to funguje úplnì jinak? :-) 



Další informace o konferenci Hw-list