Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 9. květen 2012, 19:29:48 Předmět: Řetězce |
|
|
Mělo by se na řetězce typu :
kód: |
char *string = "Text"; |
používat delete pro dealokaci ? |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 9. květen 2012, 19:41:18 Předmět: |
|
|
Kratka odpoved: Ne.
Delsi odpoved: Tyhle konstanty se nealokuji na heapu, jsou dost casto v read-only bloku pameti, takze misto
kód: |
char* string = "Text"; |
bys mel pouzivat spis
kód: |
const char* string = "Test"; |
protoze libovolny pokus neco v tom retezci zmenit ti muze shodit program. _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 9. květen 2012, 19:54:46 Předmět: |
|
|
ok dik |
|
Návrat nahoru |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 9. květen 2012, 20:07:43 Předmět: C |
|
|
zdavim
minimalne v MSVC 2008 EE to nieje konstanta teda, sa to nemusi pouzivat
ako
kód: |
const char* string = "Test"; |
napr.
kód: |
#include <stdio.h>
int main (int argc, char *argv[])
{
char *text="prd";
printf("%s",text);
text="rit palova";
printf("\n");
printf("%s",text);
return 0;
} |
nerobi problemi, MSVC 2008 EE RELEASE MODE. kompilovane ako C, nie
C++ takze ako pise OndraSej moze to robit problemi.
zatim... _________________ hadam to OpenGL este par rokov prezije |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 9. květen 2012, 20:55:05 Předmět: |
|
|
manutara> Mas trochu neporadek v tom, jak presne funguji ty const (v syntaxi, rekl bych), doporucuju prostudovat to poradne.
kód: |
const char* string = "Test"; |
je ukazatel na konstantni retezec, jde do nej libovolne vickrat priradit (jiny ukazatel na konstantni retezec). Napriklad
kód: |
const char* string = "Test";
string = "Bleble"; |
je v C++ zcela v poradku a zkompiluje se to a nic spatneho se nedeje.
Kdybys chtel kod, kde to neprojde, muselo by to byt
kód: |
const char* const string = "Test"; // konstantni ukazatel na konstantni retezec
string = "Bleble"; |
Tohle v C++ nezkompilujes, a IMO ani v C.
Jinak k te tve ukazce - to, co jsi psal neni problem, protoze v tom kodu nedojde k zadnemu spatnemu pristupu do pameti (i kdyz g++ na tom miste hlasi warning). Co nebude fungovat, je
kód: |
char* text = "prd";
text[1] = 'o';
printf("%s\n", text); |
Jinak kdybys chtel, aby tohle proslo a bylo to zcela v poradku, musel bys ten retezec alokovat na zasobniku, tj. pouzit
kód: |
char text[] = "prd";
text[1] = 'o';
printf("%s\n", text); |
_________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 10. květen 2012, 06:17:46 Předmět: retiazka |
|
|
jj uz som si uvedomil, vdaka opat som o nieco mudrejsi hehe
P.S. uz tu nebudem nieco vypisovat po piatich pivach  _________________ hadam to OpenGL este par rokov prezije |
|
Návrat nahoru |
|
 |
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 22. květen 2012, 22:16:36 Předmět: |
|
|
Já tu otázku rozšířím či přeformuluji. Normálně bych řekl, že delete/delete[] by se mělo volat na ty věci, které byly vytvořeny pomocí new/new[]. Jde to takhle říct, nebo jsou i případy, kdy se musí deletovat něco, co se nenewovalo, nebo naopak se něco newuje a nesmí se deletovat?
(Samozřejmě když pointer na objekt dostaneme jako návatovou hodnotu z nějaké cizí neznámé funkce, nevíme, odkud to je. Ale berme v potaz jen případy, kdy skutečně víme, jak to vzniklo.) |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 23. květen 2012, 06:20:01 Předmět: |
|
|
Pokud vím, platí
malloc->free
new->delete
new[]->delete[]
jinak->smazáno out-of-scope _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 23. květen 2012, 07:45:19 Předmět: |
|
|
ano vzdy treba zavolat free/delete. pokial nepouzijes malloca(), smart pointers alebo sa o to stara framework za teba. napriklad v Qt ma takmer kazdy objekt svojho parenta. ak vytvoris dialogove okno a popridavas nanho kopec prvkov tak ti staci zmazat iba to dialogove okno. svoje deti si kazdy objekt zmaze sam. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 23. květen 2012, 08:28:39 Předmět: |
|
|
Odporucam sa sustredit rovno na ISO C++11. Urcite v tomto pripade, duplom ak clovek zacina s C++, tj nastudovat a pouzivat unique_ptr, shared_ptr, weak_ptr a move() a tak dalej. Vie mi niekto vysvetlit nejaky dovod proti? _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 23. květen 2012, 09:46:11 Předmět: |
|
|
#pcmaster - Důvod proti asi žádný nebude, jelikož jsou tyto třídy standardem std, jsou také dobře odladěny (tedy jsou rychlé a spolehlivé) - příp. lze použít i boost (kde jsou také, a možná ještě o chlup lepší než ty z std).
Samozřejmě můžeš stále používat i klasické pointery (které se taky hodí), především tam, kde je rychlost kritická (jelikož klasický pointer je o trošku rychlejší) a samozřejmě za předpokladu, že odladění memory leaks ti nezabere půl roku s valgrindem. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 23. květen 2012, 10:08:33 Předmět: |
|
|
Jak píše pcmaster, C++11 de facto zastaralo operátory new a delete a v moderním (cutting edge) kódu by se už ani neměly objevit, prostě:
kód: |
auto pointer = std::make_shared<int>(1); |
a hotovo. Ještě lépe je použít std::unique_ptr všude, kde nepotřebuju ukazatel sdílet (kde nepotřebuju refcounting), který funguje téměř pouze jako compile-time check. _________________ WWW | GitHub | TW |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 23. květen 2012, 15:06:07 Předmět: |
|
|
Ako dobre sa to tu cita - uz 2 roky kodim 3d grafiku pod C# / XNA a problemy s pointermi su pre mna uz len historkou z davnej, zabudnutej minulosti
BTW, to co za stary kod si vymakol na udrzbu, ze sa tam nepouziva aspon std::string ?
char * na stringy je strasne zverstvo... |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 23. květen 2012, 15:48:29 Předmět: |
|
|
Já už několik let kódím 3D grafiku pod C++98 a problém s pointery jsem měl naposled před půlrokem...
Ale s char* souhlasím. Pochopil bych to v ANSI C, ale v C++ nevidím snad žádný důvod...
Jinak smart pointers bych v nových projektech určitě použil. _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 23. květen 2012, 15:56:32 Předmět: |
|
|
Tak char * není zvěrstvo... pokud dělám vlastní knihovnu na String např. Což jsem si udělal a jsem spokojený... std::string mi přijde jako hrozná mazanina (hlavně v případě konkatenace s čísly apod) _________________ Perry.cz |
|
Návrat nahoru |
|
 |
|