.[ ČeskéHry.cz ].
Řetězce
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
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 9. květen 2012, 19:29:48    Předmět: Řetězce Odpovědět s citátem

Mělo by se na řetězce typu :
kód:
char *string = "Text";

používat delete pro dealokaci ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 9. květen 2012, 19:41:18    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 9. květen 2012, 19:54:46    Předmět: Odpovědět s citátem

ok dik
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 9. květen 2012, 20:07:43    Předmět: C Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 9. květen 2012, 20:55:05    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 10. květen 2012, 06:17:46    Předmět: retiazka Odpovědět s citátem

jj uz som si uvedomil, vdaka opat som o nieco mudrejsi hehe

P.S. uz tu nebudem nieco vypisovat po piatich pivach Very Happy
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 22. květen 2012, 22:16:36    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



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

PříspěvekZaslal: 23. květen 2012, 06:20:01    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 23. květen 2012, 07:45:19    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 23. květen 2012, 08:28:39    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 23. květen 2012, 09:46:11    Předmět: Odpovědět s citátem

#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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Tringi



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

PříspěvekZaslal: 23. květen 2012, 10:08:33    Předmět: Odpovědět s citátem

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
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: 23. květen 2012, 15:06:07    Předmět: Odpovědět s citátem

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 Smile


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
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



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

PříspěvekZaslal: 23. květen 2012, 15:48:29    Předmět: Odpovědět s citátem

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... Twisted Evil

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 23. květen 2012, 15:56:32    Předmět: Odpovědět s citátem

Tak char * není zvěrstvo... pokud dělám vlastní knihovnu na String např. Cool 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
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 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