zdar mam teoreticky dotaz. vychadzam s toho ze realloc sa pri svojej praci pozre ci je dost miesta na alokaciu pozadovaneho bloku a ked je tak prialokuje ked nie tak celi blok premiestni. pri chybe vrati null a stary blok ostane nedotknuty (alokovany).
moj dotaz teda je. moze realloc pri "odalokovavani" (realokovani mensieho poctu bytov ako mal povodny blok) zlihat a vratit NULL?
thx
Fórum › C / C++
Realloc a NULL
No, stadnard říká:
7.20.3.4 The realloc function
Description
2 The realloc function deallocates the old object pointed to by ptr and returns a
pointer to a new object that has the size specified by size. The contents of the new
object shall be the same as that of the old object prior to deallocation, up to the lesser of
the new and old sizes. Any bytes in the new object beyond the size of the old object have
indeterminate values.
3 Ifptr is a null pointer....
Takže realloc měla vždy odalokovávat paměť tudíž, bych řekl, že takto by se to chovat nemělo. Je možné, že pokud alokuješ pole pointrů, tak vždy při změně velikosti(zmenšení) je potřeba přovést "ruční" odtranění samotných pointerů, jiank tam zůstanou viset do konce programu...
tak vždy při změně velikosti(zmenšení) je potřeba přovést "ruční" odtranění samotných pointerů, jiank tam zůstanou viset do konce programu...
akosi nechapem co tym mislis.
polozim teda otazku inak. ma zmysel kontrolovat NULL z reallocu po zmansovani bloku? stava sa vobec ze by v takomto pripade vratil NULL?
olgo píše:#
##tak vždy při změně velikosti(zmenšení) je potřeba přovést "ruční" odtranění samotných pointerů, jiank tam zůstanou viset do konce programu...
#akosi nechapem co tym mislis.#
#
No, já měl na mysli něco takového:
typedef void* PVoid;
Pvoid *pole = malloc(sizeof(PVoid)*10);
size_t size = 10;
....
....
pole = realloc(pole, sizeof(Pvoid)*5);
// a tady uz tech 5 objektu, na ktere ukazuji polozky pole[5]-pole[9] nesmazes, a zustanou viset v pameti
....
To Jura: to je predsa jedno pokial mas napameti ze uz ti nepatria. os ich moze posunut dalej a budu prepisane inou aplikaciou.
btw.: "neinicializovana premenna ma nahodnu hodotu" co mislis odkial asi pochadza?
olgo píše:#
# To Jura: to je predsa jedno pokial mas napameti ze uz ti nepatria. os ich moze posunut dalej a budu prepisane inou aplikaciou.#
#
Jedno to neni. Systém se o to postará, až když tvá aplikace skončí(a to je pozdě). Nic za tebe nemaže. V C a ni C++ není žadný GC, který by se staral o paměť. Pokud tvůj program běží, tak seš to ty kdo se musí starat o aloakci a dealokaci proměnných(a to že se ve skutečnosti nic nedealokuje je jiná věc - prostě se o tom daném bloku paměti prohlásí, že je volný). Proto pokud po sobě "neuklídíš", může dojít v průběhu programu k nedostatku paměti. Tohle je prostě pravidlo, když si něco půjčíš(malloc), tak to zase prostě vrátíš(free).
#
#btw.: "neinicializovana premenna ma nahodnu hodotu" co mislis odkial asi pochadza?
No, tohle se týká lokálních proměnných, a ty se alokují na zásobníku, takže odtamtud.
je potřeba přovést "ruční" odtranění samotných pointerů
sry ale z tohto som vyrozumel ze chces mazat samotny pointer a nie uvolnovat pamet na ktoru ukazuje.
No, tohle se týká lokálních proměnných . . .
tyka sa to aj dinamicky akokovanich premennych (calloc sice vrati vynulovany blok ale musi to urobyt sam os mu vrati "zasvinenu" pamet. malloc ju vracia ako ju dostane) a imho aj neinicializovanych globalnych premennych.
olgo píše:#
##je potřeba přovést "ruční" odtranění samotných pointerů
#sry ale z tohto som vyrozumel ze chces mazat samotny pointer a nie uvolnovat pamet na ktoru ukazuje.#
#
Sry, to jsem blbě napsal, ale myslel jsem to tak, že realloc se postará o uvolnění místa pro ten typ proměnné(v tomto případě pro void*), ale už se nepostará o uvolnění toho, na co tyto proměnné ukazují(to musíš sám).
#
#
#No, tohle se týká lokálních proměnných . . .
#tyka sa to aj dinamicky akokovanich premennych (calloc sice vrati vynulovany blok ale musi to urobyt sam os mu vrati "zasvinenu" pamet. malloc ju vracia ako ju dostane) a imho aj neinicializovanych globalnych premennych.
Imho globální proměnné jsou inicializovány automaticky. Co se týče dynamických proměnných máš pravdu, ale nikdy jsem se o to nezajímal;). Takže se to ttýka jak dynamicky alokovaých proměnných, tak lokálníc proměnných.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
/context/null/swagger-resources - NULL ?? — založil ingiraxo
Realloc matice — založil constantine
Moderátoři diskuze