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.

È stato utile?

Soluzione 4

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top