2013-04-12 5 views

risposta

5

Quando si passa il puntatore per riferimento - non si verifica alcuna copia, nessun contatore di riferimento incrementa.

myvector->push_back(rx); 

Qui, nel vettore saranno spinti copia rx, non rx, così, riferimento banco viene incrementato.

2

Quando si passa per riferimento si passa lo stesso puntatore - non si verificano copie. Quindi la durata di rx è legata alla durata dell'oggetto originale. Quando lo fai, il contenitore push_back farà una copia di rx e quindi aumenterà il numero di ref.

0

No. Questi codice appena passa il puntatore intelligente alla funzione e non aumentare il numero di riferimento di esso:

void foo(const boost::shared_ptr<Pfoo>& rx) 

Inoltre, spingendo rx al vettore aumenterà il conteggio di riferimento:

myvector->push_back(rx); 
0

smart_ptr è passsed come riferimento in modo da non incrementare il conteggio dei ref in quel momento. In caso di copia vettoriale di oggetto è inserito. Quindi il riferimento sarà incrementato.

myvector->push_back(rx); //Copy of object is passed. 
+1

Significa che se viene eseguita una copia, il riferimento verrà incrementato –

+0

@ casper_2211. Sì – shivakumar

0

Questo è corretto. Se si passa un riferimento a un puntatore condiviso, la funzione ottiene solo un riferimento (regolare C++) al riferimento (condiviso) del chiamante. Non ha il suo riferimento (condiviso). Se il riferimento (condiviso) del chiamante viene distrutto, il codice fallisce.

Questo mi è successo una volta e ha causato un bug grave che è stato difficile rintracciare e ha avuto conseguenze reali. Quindi non passare i riferimenti agli oggetti a meno che tu non sia sicuro che nulla della funzione possa avere l'effetto di distruggere l'oggetto referenziato!

push_back crea un nuovo riferimento all'oggetto.

Problemi correlati