Uvolnění paměti - výpis – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Uvolnění paměti - výpis – C / C++ – Fórum – Programujte.comUvolnění paměti - výpis – C / C++ – Fórum – Programujte.com

 

jenoc0
Newbie
15. 11. 2008   #1
-
0
-

Dobrý den. Myslím, že není třeba abych můj problém komentoval, tak vložím pouze kód:

int *p = (int*) malloc(4 * sizeof(int));    

p[0] = 5;
p[1] = 12;
p[2] = 18;
p[3] = 20;
free((void*) p);
printf("%d, %d, %d, %d", p[0], p[1], p[2], p[3]);


A zeptám se: Proč mi program vypíše 0,12,18,20 když jsem odebral programu tuto paměť? Mám to chápat tak, že sice programu odeberu paměť, ale hodnoty stále v paměti jsou? Proč se tedy smaže 5? Nebo pouze dělám něco špatně?

Předem děkuju za odpovědi.

Nahlásit jako SPAM
IP: 88.103.71.–
bukaj0
Věrný člen
15. 11. 2008   #2
-
0
-

jenoc
Proč mi program vypíše 0,12,18,20 když jsem odebral programu tuto paměť? Mám to chápat tak, že sice programu odeberu paměť, ale hodnoty stále v paměti jsou?
Nač hodnoty v paměti něčím přemazávat (nulovat kupříkladu)? Alokováním paměti se ubere blok, uvolněním se vrátí libc, která se o to stará. Většinou jsou adresy navrácených bloků ukládány na tzv. free list. A pokud se pokusíš alokovat znovu, libc se nejdříve koukne na free list, jestli se tam nachází blok potřebné velikosti, a jestli ano, tak ti ho vrátí.

Proč se tedy smaže 5?
Bůhví; záleží na implementaci alokátoru.

Nebo pouze dělám něco špatně?
Jen jedno doporučení, které s tímhle problémem moc nesouvisí: vždy kontroluj, jestli malloc() nevrací NULL ;o)

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
jenoc0
Newbie
15. 11. 2008   #3
-
0
-

Aha, tak díky za info. šlo mi o to, jestli se skutečně odebere dříve alokovaný kus paměti.

Zde jsem neuvedl kontrolu přidělení paměti jen z důvodu šetření místem a také to s mým problémem nijak nesouvisí - jinak samozřejmě kontrolu používám.

Nahlásit jako SPAM
IP: 88.103.71.–
KIIV
~ Moderátor
+43
God of flame
15. 11. 2008   #4
-
0
-

To jenoc : v pameti po odebrani ty data zustavaj dokud je necim nepremazes ...
takze pokud neco alokujes urcite to pak taky vynuluj pokud nebudes jen neco zapisovat...
na to ze neco bude prazdny se neda spolehnout ani v normalnich promennejch a v dynamicky alokovany pameti je to 100% jistota ze tam bude nejaky smeti :)

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 91 hostů

Podobná vlákna

Uvolnění paměti — založil Martin

Uvolneni pameti — založil BigBear

Uvolnění paměti / vektory — založil Ondřej

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ý