^
Citat:
Zar onda zapravo nije napravljen memory leak ako prvo alociraš pokazivač x tako da pokazuje na jedan niz, a zatim ga preusmjeriš na drugi niz. Ovaj prvi niz se sam dealocirao?
Zapravo, nije X preusmereno. Ako se ispise "adresa od X" (umesto sadrzaja), ona je uvek ona koja je jednom vec dodeljena prilikom: char* x = "123";. Nije se promenila. Promenio se samo sadrzaj string literala, a kako je i da li je prethodni sadrzaj string literala u data segmentu unisten, pojma nemam.
Drugim recima, nije mi poznato kako se unistava 123:
Code:
char *ptr1 = "123";
cout << ptr1[0] << ptr1[1] << ptr1[2];
ptr1 = "X";
cout << ptr1[0] << ptr1[1] << ptr1[2]; // <--- ne ispise se 3
... jer se izgleda ne radi o overwrite-u, barem sudeci prema ovom primeru koga sam na brzinu isprobao.
Standard
ISO/IEC 14882 kao i
The C++ Programming Language, Third Edition by Bjarne Stroustrup donekle opisuju taj slucaj u sekcijama posvecenim String literal-ima.
Poenta je da string literal treba da je const:
Citat:
...
"An ordinary string literal has type “array of n const char” and static storage duration [...]"
...
"The type of a string literal is ''array of the appropriate number of const characters'' [...]"
...
... sto je najbolje da se eksplicitno i navede (valjda ovako: char * const ptr1 = "123").
Dalje, kaze se:
Citat:
...
"The effect of attempting to modify a string literal is undefined."
...
Dakle, efekat pokusaja menjanja string literala je nedefinisan, sto je potkrepljeno primerom da dva string literala istog sadrzaja (teksta) mogu da dele istu adresu, bez obzira sto su uvedeni sa razlicitim pokazivacima!!!
Razlog sto je pokusaj menjanja dozvoljen, moze se opravdati sa cinjenicom:
Citat:
A string literal can be assigned to a char *. This is allowed because in previous definations of C and C++, the type of a string literal was char *. Allowing the assignment of a string literal to a char * ensures that millions of lines of C and C++ remain valid.
Konacno:
Citat:
"Implicit conversion of a string literal to a (non-const) char* is deprecated. You should use array of char or avoid assignment of string literals."
Ako neko ima nesto potpunije neka napise.