.[ ČeskéHry.cz ].
Neuvolneni pameti po dynamicke alokaci
Jdi na stránku Předchozí  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
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

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

Uff, toto je mega prasacina.

Toto je presne vec, na ktoru by si dynamicky alokovat pamat nemal.
Aj keby si tu pamat spravne dealokoval, takto si rozhasis a rozfragmentujes heap za chvilku.

A uz rozhodne nie systemom, ze si este posunies povodny pointer (a teda zaciatok si stratil - nehovoriac, ze je to nestandardne spravanie, takze riskujes ze nedealokujes nic, zavisiac od implementacie).

Predovsetkym si tie pointery vyskusaj na niecom inom, ako su bull-terminated stringy - idealne na nejakych intoch alebo nejakom structe, lebo teraz pleties 3 veci a si navyse dopleteny Smile
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: 18. duben 2010, 20:00:46    Předmět: Odpovědět s citátem

VladR: ja vim Sad, bohuzel jsem zil v domeni ze cokoliv je pres hvezdicku tak musim alokovat. Jinak diky ze jste me poslai tim spravnym smerem, snad uz si pri manipulacich s pointerama dam na toto pozor.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 18. duben 2010, 20:10:49    Předmět: Odpovědět s citátem

Najlepsie urobis, ak si das od tohto pauzu a v nejakom novom projekte si na par dni poriadne otestujes pracu s pointermi.

Tisickrat sa ti to vrati, ak sa ti to nebude pliest, lebo to najhorsie co mozes spravit je, ze si myslis ze uz tomu rozumies a budes pritom dalej prasit kod, ktory nepadne len cirou zhodou okolnosti.

A tiez uz som zazil v praci, ze jeden kolega podobne zazdil 2 pointere (pritom s odstupom asi tak 4 riadkov Smile ) a v klude fical dalej ako keby nic - cim vyhral cenu najprasackejsi kod vsetkych cias.

Takze - ponahlaj sa pomaly Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

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

Jo, a nikde tam nevidim try/catch v tom kode.

Nemusis ho davat do release verzie, ale preboha ziveho, kym developis, tak si to otry-catchuj - ani netusis kolko trapenia ti to moze usetrit, ked sa budes snazit zistit pricinu obcasneho crashu.
Kolkokrat ti to pocas developenia rovno odhali, ze sa snazis nepatricne alokovat/releasovat.

A zvykni si na vynulovanie pointera, ked ho deletnes. Vies ako to pomoze pri debugovani ?

Asi najmenej pracny system je to mat niekde v konstruktore nulovane a v destruktore releasovane, cim zarucis, ze ked program skonci, resp. tvoj objekt vypadne z akt.bloku, tak sa to samo releasne (a pri alokacii zistuj, ci netreba releasnut najprv).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 18. duben 2010, 20:27:24    Předmět: Odpovědět s citátem

Ked tu uz vo velkom spamujem, tak mi neda doplnit poslednu vec, ktora patri pri pointeroch najzradnejsia a je dovodom kontrol pri praci s nimi (mimo deletovania, kedy standard zarucuje, ze je mozne korektne zavolat delete []p, pricom p==NULL).

Ty nejakym sposobom navrhnes flow programu a tomu prisposobis (de)alokaciu dyn.pamate.

Zanedlho pride novy request, ktory logicky dany flow zmeni. Ale to si uz nebudes davno pamatat, cize nechtiac zavedies do kodu leak/crash.
Proste tie kontroly ta chrania pred sebou samym, lebo C++ bolo navrhnute tak, aby si si sam vedel strelit do nohy.


A nie vzdy si clovek chce strelit do nohy ...

Jasne, su techniky ako to vylucit uplne, ale nez ta odradit uplne, tak radsej aspon toto...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 18. duben 2010, 21:59:54    Předmět: Odpovědět s citátem

Ad nulování:

kód:

template<typename T>
void safe_delete(T* &ptr) {
  if (ptr != NULL) {
    delete ptr;
    ptr = NULL;
  }
}


DÚ: napište verzi pro pole
Disclaimer: někdo má radši makrovou verzi, to mu neberu
Jinak pokud člověk chce, aby mu kód v C++ fungoval, bude se ručnímu alokování/dealokování vyhýbat jako čert kříži.
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
JohnyDog



Založen: 17. 08. 2007
Příspěvky: 66

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

delete 0 je zaruceny no-op jak uz psal VladR, takze se da zjednodusit na
kód:

    delete ptr;
    ptr = NULL;

_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



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

PříspěvekZaslal: 18. duben 2010, 22:42:05    Předmět: Odpovědět s citátem

Není nakonec lepší používat staré dobré malloc a free, které nerozlišuje jeden prvek a pole? Akorát nevím, jak potom s konstruktorama... Ale tuším na to něco je.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 18. duben 2010, 22:43:35    Předmět: Odpovědět s citátem

JohnyDog napsal:
delete 0 je zaruceny no-op jak uz psal VladR, takze se da zjednodusit na
kód:

    delete ptr;
    ptr = NULL;

Zlate FreeAndNil v Delphi Wink
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 18. duben 2010, 22:56:11    Předmět: Odpovědět s citátem

frca napsal:
Není nakonec lepší používat staré dobré malloc a free, které nerozlišuje jeden prvek a pole? Akorát nevím, jak potom s konstruktorama... Ale tuším na to něco je.


Tohle nemyslíš vážně, že ne?
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

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

frca napsal:
Není nakonec lepší používat staré dobré malloc a free, které nerozlišuje jeden prvek a pole? Akorát nevím, jak potom s konstruktorama... Ale tuším na to něco je.
Uff, kde zacat...

1. malloc/free je Pure-C, takze pokial nepouzivas PureC-libraries, tak by si vobec malloc pouzivat nemal
2. new / delete ti zavola c-tor/d-tor na kazdom elemente, co je na nezaplatenie, lebo sa nemusis o dyn. pamat starat vobec, v pripade ze alokaciu riesis cez vnutorne metody (kde si das pozor aby si dva razy nedal new na ten isty pointer).
O inicializacii hodnot cl.premennych triedy ani nehovoriac - kolko krat sa vam uz stalo, ze sa vam podarilo reprodukovat bug, debugovali ste kod a zrazu ste nevedeli, ci dana premenna vobec mala priradenu nejaku hodnotu ?
3. malloc treba pretypovat, co rozhodne citatelnosti nepridava



Mem : Ale fuj - take pajazyky tu spominas Smile
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: 19. duben 2010, 06:13:53    Předmět: Odpovědět s citátem

Někomu vyhovuje NULL, někomu 0, někomu zas nullptr Smile
Ale všechno je to rozhodně lepší než wild pointers Wink
_________________
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
frca



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

PříspěvekZaslal: 19. duben 2010, 07:11:57    Předmět: Odpovědět s citátem

Quiark napsal:
frca napsal:
Není nakonec lepší používat staré dobré malloc a free, které nerozlišuje jeden prvek a pole? Akorát nevím, jak potom s konstruktorama... Ale tuším na to něco je.


Tohle nemyslíš vážně, že ne?

Jo, no, byl to blbý nápad.
Místo toho by se dalo ještě použít vždy new Neco[1] místo new Neco, ale mám pocit, že pokud v tom má člověk takový bordel, že neví, co je ukazatel na jednu hodnotu a co ukazatel na pole, tak ho to stejně nezachrání.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 19. duben 2010, 07:45:32    Předmět: Odpovědět s citátem

A co tym akoze ziskas, ze spravis new foo [1] ? To je praveze este nebezpecnejsie.

ad ukazovatel na pole - to je bezna chybka - lenze nazov pola je adresou prveho elementu pola.

Pole samotne nie je ukazovatel, kedze je const, takze nemozes napisat foo = bar (pricom int * bar), co pritom s regulerne zadeklarovanymi pointermi spravit ide.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



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

PříspěvekZaslal: 19. duben 2010, 08:43:46    Předmět: Odpovědět s citátem

Možnost na "všechno" volat delete[], ale jak říkám, v dobře napsaném programu je to k ničemu.
PS: Když tak nad tím přemýšlím, tak s ukazatelem na pole alokovaným pomocí new[] musí být nějak spojen počet prvků, aby bylo jasné, na kolik se jich má zavolat destruktor. Nevíte, jak to překladače řeší?
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
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  Další
Strana 2 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