[ kelja @ 18.05.2007. 19:13 ] @


Zanima me zasto je u svim knjigama konstruktor kopije realizovan na sledeci nacin:

Code:

class String {
   char* niz;
 public:
   String(String& s) {
      niz=new char[strlen(s.niz)+1];
      strcpy(niz,s.niz);
   }
}
 


kada je mnogo jednostavnije ovako:

Code:

String(String& s) {
  niz=s.niz;
}
[ X Files @ 19.05.2007. 07:34 ] @
Ako nešto nisam omašio, ti si početak niza karaktera niz vezao za početak niza s.niz
čiji je 'rok trajanja' prvi sledeći izlazak iz bloka {}, pa će tako i niz vrlo brzo pokazivati
na nešto što više nije validno.
[ NastyBoy @ 19.05.2007. 11:25 ] @
Knjishki pristup je sasvim kako treba.

Pravo reshenje je negde izmedju, tzv. "copy-on-write", gde se pravi kopija bafera jedino u sluchaju da neki od objekata koji ga dele pokusha da ga promeni.
[ tosa @ 19.05.2007. 14:20 ] @
Citat:
X Files: Ako nešto nisam omašio, ti si početak niza karaktera niz vezao za početak niza s.niz
čiji je 'rok trajanja' prvi sledeći izlazak iz bloka {}, pa će tako i niz vrlo brzo pokazivati
na nešto što više nije validno.

String s je prosleđen kao referenca, tako da će memorija/pointer biti validna ali
ostaje problem deljenja istog sadržaja između dva stringa, kao što je Bojan pomenuo.

Boki, potpis ti je carski :)
[ X Files @ 19.05.2007. 14:34 ] @
Good catch.
[ kelja @ 19.05.2007. 16:50 ] @
Hvala svima!

@toso,
u kojim situacijama drugo resenje moze predstavljati problem?

[ Dragi Tata @ 20.05.2007. 14:15 ] @
Citat:
kelja: u kojim situacijama drugo resenje moze predstavljati problem?


Probaj da staviš delete niz u destruktor i kazaće ti se samo.
[ Dragi Tata @ 20.05.2007. 14:18 ] @
Citat:
NastyBoy: Pravo reshenje je negde izmedju, tzv. "copy-on-write", gde se pravi kopija bafera jedino u sluchaju da neki od objekata koji ga dele pokusha da ga promeni.


Onda moraš da ga "lockuješ". Znaš li neku implementaciju std::string koja koristi COW?
[ NastyBoy @ 20.05.2007. 17:39 ] @
Nishta ozbiljnije nisam probao, iskreno. Pogledao sam par relativno jednostavnih implementacija, ali nijedna nije drop-in zamena za std::string. Moja bolest "string je ili hash ili se ne koristi" je u metastazi