View Full Version : [BOOST/C++]Problemi con shared_ptr
vi pongo un problema...
quello che faccio più o meno è questo:
while(ne_ho_voglia){
std::vector<boost::shared_ptr<Pippo> > vettore;
popolaVettore(vettore); // un pò più complesso di così, ma la parte importante è che prende un riferimento del vector e lo riempie
ClasseEnorme.usaVettore(vettore); //altro riferimento e non so che faccia (non ho i sorgenti)
}
ora, se ho capito bene sti shared_ptr mi servono a evitare di crearmi milioni di copie della stessa cosa portandomi dietro un'unica copia che si distrugge da sola alla morte dell'ultimo riferimento...
perchè allora se in ClasseEnorme c'è un riferimento al vettore questi mi vengono distrutti appena ciclo la volta dopo?
c'è un errore banale da qualche parte?
grazie, ciao!!!!
mi ero scordato di segnalare che, controllando use_count alla fine del ciclo, dà due... :cry:
non capisco bene il tuo codice, scusa.
Come popoli il vettore? Devi farci vedere anche quella parte.
Comunque il vettore appena esce dallo scope invoca i distruttori di tutti i tuoi shared_ptr, decrementando i loro counter.
Se ricordo bene il reference counter di uno shared_ptr incrementa quando invochi il copy constructor o l'assignement operator di shared_ptr.
Se riempi il vettore con questo codice, per esempio:
vettore.push_back(boost::shared_ptr<Pippo>(oggettoPippo));
Oppure, se si puo` fare, non ricordo
vettore.push_back(oggettoPippo);
Ti andrebbe a cancellare sicuramente l'oggetto una volta che vettore viene distrutto.
ok, ti rilancio un pò di codice!
while (TANTO) {
std::vector<boost::shared_ptr<PIPPO> > pippi = prendiPippi(); //ritorna una copia di un vettore pieno
classeEnorme.funzioneAssurda(pippi); //passa vettore per riferimento
std::vector<boost::shared_ptr<PIPPO> > pippiNuovi = classeEnorme.ridammiPippi();
/*per ogni pippo stampo posizione e numero di riferimenti in shared_ptr*/
}
poi mettendo nel distruttore la stampa delle stesse coordinate ottengo:
DISTRUGGO 199 75
199 75 2
DISTRUGGO 199 75
DISTRUGGO 199 75
DISTRUGGO 200 75
200 75 2
DISTRUGGO 200 75
DISTRUGGO 200 75
DISTRUGGO 204 76
204 76 2
DISTRUGGO 204 76
DISTRUGGO 204 76
DISTRUGGO 210 69
210 69 2
DISTRUGGO 210 69
210 69 2
210 69 2
210 69 2
210 69 2
210 69 2
210 69 2
210 69 2
210 69 2
210 69 2
210 69 2
DISTRUGGO 210 69
DISTRUGGO 231 61
231 61 2
DISTRUGGO 231 61
231 61 2
231 61 2
DISTRUGGO 231 61
DISTRUGGO 206 73
206 73 2
DISTRUGGO 206 73
DISTRUGGO 206 73
DISTRUGGO 206 73
206 73 2
DISTRUGGO 206 73
DISTRUGGO 206 73
DISTRUGGO 205 76
205 76 2
DISTRUGGO 205 76
DISTRUGGO 205 76
DISTRUGGO 205 76
205 76 2
DISTRUGGO 205 76
DISTRUGGO 205 76
DISTRUGGO 205 81
205 81 2
DISTRUGGO 205 81
DISTRUGGO 205 81
DISTRUGGO 204 85
204 85 2
DISTRUGGO 204 85
DISTRUGGO 204 85
DISTRUGGO 210 85
210 85 2
DISTRUGGO 210 85
DISTRUGGO 210 85
DISTRUGGO 210 86
210 86 2
DISTRUGGO 210 86
DISTRUGGO 210 86
DISTRUGGO 210 88
210 88 2
DISTRUGGO 210 88
DISTRUGGO 210 88
DISTRUGGO 210 88
210 88 2
DISTRUGGO 210 88
DISTRUGGO 210 88
DISTRUGGO 211 88
211 88 2
DISTRUGGO 211 88
DISTRUGGO 211 88
non capisco il perchè... il riferimento è a 2 e non dovrebbe permettersi di chiamarlo... :(
ciao ciao!!!
Sara` il venerdi` pomeriggio ma trovo il codice troppo offuscato.
Comunque la mia idea al momento e` che tutti gli shared_ptr escono dallo scope ad ogni ciclo decrementando i contatori fino a zero.
Immagino che i primi shared_ptr stiano dentro pippi che esce dallo scope ad ogni ciclo e i secondi in pippinuovi che esce dallo scope a sua volta...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.