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
|
Zaslal: 18. duben 2010, 18:47:22 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 18. duben 2010, 20:00:46 Předmět: |
|
|
VladR: ja vim , 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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 18. duben 2010, 20:10:49 Předmět: |
|
|
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 ) a v klude fical dalej ako keby nic - cim vyhral cenu najprasackejsi kod vsetkych cias.
Takze - ponahlaj sa pomaly  |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 18. duben 2010, 20:15:58 Předmět: |
|
|
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 18. duben 2010, 20:27:24 Předmět: |
|
|
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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 18. duben 2010, 21:59:54 Předmět: |
|
|
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 |
|
 |
JohnyDog

Založen: 17. 08. 2007 Příspěvky: 66
|
Zaslal: 18. duben 2010, 22:10:48 Předmět: |
|
|
delete 0 je zaruceny no-op jak uz psal VladR, takze se da zjednodusit na
kód: |
delete ptr;
ptr = NULL;
|
_________________
 |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 18. duben 2010, 22:42:05 Předmět: |
|
|
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 |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 18. duben 2010, 22:43:35 Předmět: |
|
|
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  _________________
 |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 18. duben 2010, 22:56:11 Předmět: |
|
|
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 18. duben 2010, 22:56:28 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 19. duben 2010, 06:13:53 Předmět: |
|
|
Někomu vyhovuje NULL, někomu 0, někomu zas nullptr
Ale všechno je to rozhodně lepší než wild pointers  _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 19. duben 2010, 07:11:57 Předmět: |
|
|
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 19. duben 2010, 07:45:32 Předmět: |
|
|
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 |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 19. duben 2010, 08:43:46 Předmět: |
|
|
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 |
|
 |
|