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
|
Zaslal: 17. duben 2010, 15:02:08 Předmět: Neuvolneni pameti po dynamicke alokaci |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 17. duben 2010, 15:22:37 Předmět: |
|
|
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 |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 17. duben 2010, 15:24:43 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 17. duben 2010, 15:36:01 Předmět: |
|
|
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 |
|
 |
johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 17. duben 2010, 15:46:05 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 17. duben 2010, 16:15:35 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 17. duben 2010, 16:22:53 Předmět: |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 17. duben 2010, 17:13:28 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 17. duben 2010, 17:16:09 Předmět: |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 17. duben 2010, 17:16:53 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 17. duben 2010, 17:26:36 Předmět: |
|
|
ok, sorry za ty prasarny ale kazdej se to jednou uci  |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 17. duben 2010, 17:38:39 Předmět: |
|
|
Use the valgrind, Luke! _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 17. duben 2010, 17:48:47 Předmět: |
|
|
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 - 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 |
|
 |
Khaj

Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 18. duben 2010, 17:19:48 Předmět: Boze! |
|
|
ReceivedCommand += 4;
Co se stane kdyz k pointru prictu 4?
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 18. duben 2010, 17:58:12 Předmět: |
|
|
Co dodat? Typický příklad nekorektní (a pěkně hnusné ) manipulace s ukazateli. Autor zřejmě nechápe princip ukazatelů  _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
|