.[ ČeskéHry.cz ].
Dealokace
Jdi na stránku Předchozí  1, 2, 3
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 13. červenec 2012, 13:35:37    Předmět: oprava Odpovědět s citátem

citace:
to je pravda, ale napr.kód:
if((tag1->type_name=malloc(sizeof(char)*size_name*20))==NULL){
printf("\nerror -> malloc() for type_name\n");
}
printf("\nnoerror -> malloc() for type_name\n");


na vypise jekód:
noerror -> malloc() for type_name

a program padne, cize ked alokujem 20GB pamate.

na druhej stranekód:
if((tag1->type_name=malloc(sizeof(char)*size_name*2))==NULL){
printf("\nerror -> malloc() for type_name\n");
}
printf("\nnoerror -> malloc() for type_name\n");


na vypise jekód:
error -> malloc() for type_name !!!!!!!!!

noerror -> malloc() for type_name

a program skonci korenktne bez padu. v tomto pripade alokujem len 2GB pamate.


sa ospravedlnujem za neskutocnu chybu ktora je v tomto kode.

pre vysvetlenie: pisem, ze ked alokujem 20GB pamate tak malloc()
nevracia NULL a teda, ze vraj je mozne alokovat nasobky fyzickej
RAM s nemoznostou si to kontrolovat. to nieje tak celkom pravda.

pri pohlade na malloc(), si malloc() berie ako argument pocet velkosti
``size_t'' co je v mojom pripade 4bajtove slovo. problem je v pocte.

sizeof(char)*size_name*20) nieje 20GB dat, ale 0B dat. ono sa to cislo
vlastne do size_t nezmesti a teda alokujem 0B. alokovat 0B je mozne,
podla msdn malloc(0) alokuje ``zero-length'' prvok na halde a odovzda
``PLATNY'' ukazovatel. ukazovatel je platny len dlzka alokovanej pamate
je 0B.

z tohto potom vypliva, ze malloc() vracia stale bud platny ukazovatel, alebo
NULL a teda je v kazdom pripade mozne, podla mna aj nutne, testovat
navratovu hodnotu z malloc().
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 13. červenec 2012, 13:48:56    Předmět: Odpovědět s citátem

citace:
u 64bit systemu jsou to proste 4GB - vic stejne nelze ve 32bit adresovem prostoru aplikace adresovat

Asi se jedná o překlep a měl jsi na mysli u "32bit systému jsou to prostě 4GB". Jelikož v 64bit systému mohu klidně zavolat malloc(1024 * 1024 * 1024 *16 * sizeof(char)) a bez problému mi malloc vrací korektní adresu. Wink
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 13. červenec 2012, 14:26:12    Předmět: Odpovědět s citátem

Vilem Otte napsal:
citace:
u 64bit systemu jsou to proste 4GB - vic stejne nelze ve 32bit adresovem prostoru aplikace adresovat

Asi se jedná o překlep a měl jsi na mysli u "32bit systému jsou to prostě 4GB". Jelikož v 64bit systému mohu klidně zavolat malloc(1024 * 1024 * 1024 *16 * sizeof(char)) a bez problému mi malloc vrací korektní adresu. Wink


ja bych doporucil cist co pisu - jasne jsem psal ze limit je 4GB pro 64bit system a v nem bezici 32bit aplikaci - ja se nebavil ani omylem o 64bit aplikacich! - cely post je LARGE_ADDRESS_AWARE a to se 64bit aplikaci netyka ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 13. červenec 2012, 14:54:15    Předmět: Odpovědět s citátem

ako hovorim testovat na NULL je dost zbytocne ako mozete vidiet podarilo sa mi alokovat 30 TB takze moj program bude zostrleny akonahle sa rozhodnem tuto pamet vyuzit.
http://i.imgur.com/ieELA.png

BTW alokoval som 300000@100MB bloky. skutocnej RAM to zabralo priblizne 4GB co pripisujem OS overheadu.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 13. červenec 2012, 15:53:39    Předmět: 13TB Odpovědět s citátem

-> nou

pokial ide o 64bit system, nejaky linux to asi bude (alebo bsd atd.) podla
screenshot-u. je to mozne. na viacerych forach po nete sa povaluju
informacie a maximalnej alokovatelnej pamati. tak matne si spominam,
ze ista distribucia linuxu (64bit) umoznnuje alokovat v principe ``lubovolne''
velky blok pamate (mozno aj nekonecno Wink hehe) nehadam sa, je to mozne
ved na tom obrazku to vidiet.

nicmene ja robim pod win (64bit), ale 32bit aplikacie cize tam je obmedzenie
velke, spomenute 4GB a testovat navratovu hodnotu z malloc() sa odporuca
a ja to tak aj robim. nestoji to vela a moje programi zatial nepadli na niecom
co je spojene so spravou pamate.

msdn `` Always check the return from malloc, even if the amount of memory
requested is small.''
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3
Strana 3 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna