2015-08-10 11 views
7

In the book The C++ Standard Library a pagina 91 ho letto questa storia shared_from_this():Perché shared_from_this non può essere utilizzato nel costruttore dal punto di vista tecnico?

Il problema è che shared_ptr si memorizza in un membro privato di Person 's classe base, enable_shared_from_this<>, alla fine del costruzione della persona.

Il frammento di codice rilevante del libro è:

class Person : public std::enable_shared_from_this<Person> { 
    ... 
}; 

Non capisco due cose qui:

  1. chi è questo shared_ptr che si memorizza?
  2. come si può memorizzare da qualche parte alla fine della costruzione di Person? Penso che la costruzione di Person finisca con l'ultima dichiarazione del suo costruttore che ha scritto da me.

Capisco che ci sia weak_ptr che non è stato ancora inizializzato.

MODIFICA: Grazie ad Angew! shared_from_this funzionerà solo dopo che è stato creato il primo shared_ptr a Person. Questo shared_ptr controllerà se la classe Person è ereditata da enable_shared_from_this e se sì, inizializza il suo interno weak_ptr.

+2

Non mi ero reso conto che probabilmente stavi solo chiedendo queste [Note] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this) –

+0

@MarcoA. Grande, queste note sono davvero d'aiuto! – Yola

risposta

15

La ragione è semplice: in oggetto X, enable_shared_from_this opere di inizializzazione di una nascosta weak_ptr con una copia del primo shared_ptr che punta di opporsi X. Tuttavia, per un shared_ptr in modo che punti a X, X deve già esistere (deve essere già stato creato). Di conseguenza, mentre il costruttore di X è in esecuzione, non è ancora disponibile il shared_ptr che potrebbe essere utilizzato da enable_shared_from_this.

prendere questo pezzo di codice:

std::shared_ptr<Person> p(new Person()); 

Prima il costruttore di p (del shared_ptr) viene anche chiamato, il suo argomento deve essere valutata. Questo argomento è l'espressione new Person(). Pertanto, il costruttore di Person viene eseguito prima che il costruttore di p abbia addirittura iniziato — prima che ci sia un qualsiasi oggetto shared_ptr a cui potrebbe legarsi enable_shared_from_this.

+0

"...' enable_shared_from_this works' inizializzando un 'weak_ptr' nascosto con una copia del primo' shared_ptr' che punta all'oggetto 'X'." Quale procedura è responsabile per inizializzare questo 'weak_ptr' nascosto? Come fa a sapere qual è il "primo" 'shared_ptr' che punta a' X'? – Chad

+1

@Chad Vedere le note qui per alcune informazioni: http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr – Holt

+1

Grazie a @Holt. Sembra che un costruttore di 'shared_ptr' sia responsabile dell'inizializzazione di' weak_ptr'.Solo i costruttori che accettano un puntatore non elaborato (ad esempio un puntatore restituito da una chiamata a una nuova) eseguono l'inizializzazione. Copia i costruttori no. Poiché solo il primo 'shared_ptr' a' X' dovrebbe essere costruito da un puntatore raw (gli altri di solito sono copiati), 'weak_ptr' è inizializzato dal primo' shared_ptr' a 'X'. – Chad

Problemi correlati