.[ ČeskéHry.cz ].
Neuvolneni pameti po dynamicke alokaci
Jdi na stránku 1, 2, 3  Další
 
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
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 17. duben 2010, 15:02:08    Předmět: Neuvolneni pameti po dynamicke alokaci Odpovědět s citátem

Zdar,

potykam se s jednim problemem...v programu dynamicky alokuju pamet a hned po dokonceni cyklu ji mazu. Jenze program mi kyne dal ikdyz by nemel. Je mozne ze jsem to blbe pochopil a nelze tu pamet mazat za chodu? Ale to mi pripada jako chujovina nejvetsi.

kód:

//cely to beha v nekonecnym cyklu kterej se dokonci az po prijeti zpravy na konec programu...
                            char * ReceivedCommand = new char[strlen(ReceivedMainAnswer)+1]; 
                            int  ReceivedCommandSize = 0;       
                            ReceivedCommand = strstr(ReceivedMainAnswer,"\r\n\r\n"); 
                            ReceivedCommand += 4;   
                            ReceivedCommandSize = strlen(ReceivedCommand);
                            if(!ReceivedCommand) return 0;   
                           
                                switch(ReceivedCommand[0])
                                {
                                   case 'o':                                   
                                            ReceivedCommand+=2;
                                   break;   
                                   
                                   case 's':   
                                            ReceivedCommand+=2;
                                   break;
                                   
                                   case 'l':
                                            ReceivedCommand+=2;
                                   break;
                                   
                                   default:
                                        printf("spim..nejsou pokyny ;)\n");
                                        Sleep(6000);
                                   break;
                                }
                            if(ReceivedCommand) delete [] ReceivedCommand;


Dik za napady. Jatro
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 17. duben 2010, 15:22:37    Předmět: Odpovědět s citátem

ta pointerova aritmetika sa mi vobec nepaci. menis tam adresu pointra cim sa myslim rozhasi uvolnovanie pamate.myslim ze musis uvolnovat ten isty pointer co si dostal z new/malloc inak to nefunguje.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 17. duben 2010, 15:24:43    Předmět: Odpovědět s citátem

Jsou radky:
kód:

char * ReceivedCommand = new char[strlen(ReceivedMainAnswer)+1];
...
if(ReceivedCommand) delete [] ReceivedCommand;

oba dva uvnitr nebo mimo smycku?
Pokud je radek
kód:
char * ReceivedCommand = new char[strlen(ReceivedMainAnswer)+1];

uvnitr smycky a radek
kód:
if(ReceivedCommand) delete [] ReceivedCommand;
za ni, pak pri mazani uvolnis jen posledni alokaci...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 17. duben 2010, 15:36:01    Předmět: Odpovědět s citátem

Deluxe: nene, vsechno je ve smycce.

nou: no, tusil jsem ze bude problem s tim strstr...nejakej napad jak to napravit? V tom poli potrebuju hledat a asi ta funkce strstr je na toto nejidealnejsi :/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
johnnash



Založen: 30. 07. 2007
Příspěvky: 80

PříspěvekZaslal: 17. duben 2010, 15:46:05    Předmět: Odpovědět s citátem

Na prvnim radku ukazuje ukazatel na kus nove pameti, na tretim radku(strstr) si okamzite odriznes vetev pod nohama a nemas uvolnovat co.
Spis napis co potrebujes udelat cely mi to pripada delane pres ruku.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 17. duben 2010, 16:15:35    Předmět: Odpovědět s citátem

jonash: hele, HTTP hlavicka co dojde ze serveru, za \r\n\r\n je ten content co je na strance (obsah v prohlizeci) a presne ten ja potrebuju dostat dal abych s nim mohl pracovat. Toto bylo jedeiny reseni xD co me napadlo..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 17. duben 2010, 16:22:53    Předmět: Odpovědět s citátem

tak po par zkouskach,
kód:
char * ReceivedCommand = strstr(ReceivedMainAnswer,"\r\n\r\n"); 


toto je reseni pri kterym se pamet uvolni spravne. Jenom nejak nechapu xD proc mi to necrashne. On si to naalokuje podle toho pointeru co dostane? Nebo jak to dostane?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



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

PříspěvekZaslal: 17. duben 2010, 17:13:28    Předmět: Odpovědět s citátem

boha ted se divam - co to tam delas - vzdyt ty alokujes pole, ale potom dealokujes neco zcela jinyho!!!!!

nikde nepouzivas strcpy jenom strstr - to nedela kopii!!!

v tom kodu neni treba jedine alokace a dealokace - to co delas ti samozrejme fungovat nemuze - naalokujes pamet, pak do toho pointeru priradis neco zcela jineho a to uvolnis -> neuvolnujes tu drive naalokovanou pamet
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 17. duben 2010, 17:16:09    Předmět: Odpovědět s citátem

rezna:
1) return ok, mas pravdu ale v 99.99% vzdycky dojde spravna odpoved ze serveru ktera neni pradzdna - to si osetrim, tim to nebylo.
2)pevnej buff nemuzu pouzit protoze potrebuju plovouci velikost toho bufferu. A pokud nikdo nemate namitky proti tomu mymu reseni co jsem posilal tak se da rict ze jsem to vyresil.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



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

PříspěvekZaslal: 17. duben 2010, 17:16:53    Předmět: Odpovědět s citátem

Játro.m napsal:
tak po par zkouskach,
kód:
char * ReceivedCommand = strstr(ReceivedMainAnswer,"\r\n\r\n"); 


toto je reseni pri kterym se pamet uvolni spravne. Jenom nejak nechapu xD proc mi to necrashne. On si to naalokuje podle toho pointeru co dostane? Nebo jak to dostane?


nic nealokujes -> neni co dealokovat - nejsi v C# kde je string immutable, jsi v C a hybes si s pointerama - tot vse
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 17. duben 2010, 17:26:36    Předmět: Odpovědět s citátem

ok, sorry za ty prasarny ale kazdej se to jednou uci Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



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

PříspěvekZaslal: 17. duben 2010, 17:38:39    Předmět: Odpovědět s citátem

Use the valgrind, Luke!
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



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

PříspěvekZaslal: 17. duben 2010, 17:48:47    Předmět: Odpovědět s citátem

citace:
2)pevnej buff nemuzu pouzit protoze potrebuju plovouci velikost toho bufferu. A pokud nikdo nemate namitky proti tomu mymu reseni co jsem posilal tak se da rict ze jsem to vyresil.


ale muzes Smile - akorat musi byt dostatecne velkej a na jeho konec musis pripadne zapsat spravne nulu (coz pripadne strcpy stejne udela) a pak funguji spravne vsechny str*() funkce

a kdyz ne pevnej tak alloca()
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Khaj



Založen: 16. 01. 2008
Příspěvky: 49

PříspěvekZaslal: 18. duben 2010, 17:19:48    Předmět: Boze! Odpovědět s citátem

ReceivedCommand += 4;

Co se stane kdyz k pointru prictu 4?
Arrow Posunu se pointrem o 4 velikosti ukazovaneho objeku dopredu.

A tedka - co se stane s tou pameti o kterou sme se posunuli?
Nic. Ale dulezity je si uvedomit, ze se s ni stane nic i pri zavolani delete na ten posunutej pointr. Pamet se maze od bodu kde se posunula o 4, takze ty stary 4 chary tam budou strasit navzdy, protoze je nikdo nesmaze.

Pokud cela tahle hruza beha v cyklu tak musi zabirat 4*pocet iteraci cyklu bajtu neuvolnitelny pameti.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 18. duben 2010, 17:58:12    Předmět: Odpovědět s citátem

Co dodat? Typický příklad nekorektní (a pěkně hnusné Twisted Evil ) manipulace s ukazateli. Autor zřejmě nechápe princip ukazatelů Very Happy
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
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 1, 2, 3  Další
Strana 1 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