Realloc a NULL – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Realloc a NULL – C / C++ – Fórum – Programujte.comRealloc a NULL – C / C++ – Fórum – Programujte.com

 

olgo0
Věrný člen
14. 7. 2007   #1
-
0
-

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

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Jura
~ Anonymní uživatel
637 příspěvků
14. 7. 2007   #2
-
0
-

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...

Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
14. 7. 2007   #3
-
0
-

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?

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Jura
~ Anonymní uživatel
637 příspěvků
14. 7. 2007   #4
-
0
-

Aha, no já myslel, že se ti to už stalo;). No, takhle vždycky by se měly kontrolovat návratové hodnoty a myslím, že těch pár instrukcí navíc, za chybu kterou, může způsobit dereferencování NULL, se vyplatí vždy.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
14. 7. 2007   #5
-
0
-

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
....

Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
14. 7. 2007   #6
-
0
-

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?

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Jura
~ Anonymní uživatel
637 příspěvků
14. 7. 2007   #7
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
14. 7. 2007   #8
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Jura
~ Anonymní uživatel
637 příspěvků
14. 7. 2007   #9
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 30 hostů

Podobná vlákna

Realloc() — založil Kuba-$

Realloc — založil Martin

Realloc — založil oxidián

Realloc matice — založil constantine

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý