costruire due oggetti shared_ptr dal medesimo puntatore
-
22-08-2019 - |
Domanda
Ho un problema da "C ++ standard Biblioteca Estensioni":
Esercizio 6
Ho detto nel paragrafo 2.4.2 che non si deve costruire due shared_ptr oggetti dalla stessa puntatore. Il pericolo è che sia oggetti shared_ptr o loro progenie finirà per cercare di eliminare il risorse, e che di solito porta a guaio. In realtà, si può fare questo se si sta attenti. Non è particolarmente utile, ma scrivere un programma che costruisce due shared_ptr oggetti provenienti lo stesso puntatore ed elimina il risorsa solo una volta.
di seguito è la mia risposta:
template <typename T>
void nonsence(T*){}
struct SX {
int data;
SX(int i = 0) :
data(i) {
cout << "SX" << endl;
}
~SX() {
cout << "~SX" << endl;
}
};
int main(int argc, char **argv) {
SX* psx=new SX;
shared_ptr<SX> sp1(psx),sp2(psx,nonsence<SX>);
cout<<sp1.use_count()<<endl;
return 0;
}
, ma non credo che si tratta di una buona soluzione - perché non voglio risolverlo con l'uso del costruttore. qualcuno mi può dare uno migliore? thx, perdona il mio cattivo inglese.
Soluzione 4
ho avuto la risposta "STANDARD" dalla spinta doc: http: // www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp
Altri suggerimenti
Tutto quello che dovete fare è costruire il secondo shared_ptr
dal primo <=>.
shared_ptr<SX> sp1( new SX );
shared_ptr<SX> sp2( sp1 );
La SX creato verrà quindi correttamente cancellato solo quando tutti i puntatori condivisi ad esso sono distrutti.
Il trucco che avete trovato è valido, anche se inutile. La caratteristica centrale di shared_ptr
è di conteggio dei riferimenti, che si sovvertire qui. Il deleter (il secondo argomento del costruttore) è lì per l'utilizzo con le risorse <=> diversi da puntatori semplici. È possibile utilizzare con i file, per esempio:
typedef boost::shared_ptr FilePtr;
void FileClose( FILE* pf ) { if ( pf ) fclose( pf ); }
FilePtr pfile( fopen( "filename" ), FileClose );
Lo stesso con connessioni al database, prese, ecc ecc e RAII in generale.
Si può guardare a come spinta risolve con shared_from_this . Ecco il .