confusione sulla gestione di nuovi puntatori intelligenti su frame stack?

0

Fammi provare ad elaborarlo.

Frame stack: quando eseguiamo una funzione, crea uno stack in cui risiedono tutte le variabili e le istruzioni locali.
 E Puntatore intelligente: un puntatore intelligente come std::unique_ptr consente di modificare la proprietà dell'oggetto all'interno del puntatore intelligente.

Ora la mia confusione è: supponiamo di passare un unique_ptr da una funzione sorgente a una funzione target , il rvalue sarà assegnato al puntatore target da% codice%. Ora se la funzione termina, il frame dello stack verrà deallocato. Quindi std::move nella funzione obiettivo sarà un puntatore pendente, poiché unique_ptr punta alla stessa posizione di memoria che si trova nello stack frame della funzione sorgente?

Una cosa che ho pensato è, poiché la durata della funzione target sarà terminata prima della vita della funzione sorgente. In modo che non causi tali effetti collaterali. Ma in applicazioni più complesse con ambiente multi-thread, come va? O di cosa dobbiamo occuparci?

    
posta twid 29.09.2014 - 08:37
fonte

1 risposta

3

Stai confondendo due cose: scope , che governa la durata degli oggetti, e stack frames , che sono un dettaglio di implementazione e non sono rilevanti qui.

Now my confusion is suppose we pass unique_ptr from source function to target function, The rvalue will be assigned to target pointer by std::move

Quindi hai spostato in modo esplicito la proprietà dall'oggetto unique_ptr del chiamante (nella funzione sorgente) al unique_ptr del callee (nella funzione obiettivo). L'oggetto unique_ptr dell'oggetto sorgente non possiede più nulla e non puoi dereferenziarlo.

Ora, quando la funzione target restituisce (o genera un'eccezione - qualsiasi cosa che causa l'uscita dell'ambito) e l'oggetto unique_ptr della destinazione viene distrutto, eliminerà l'oggetto precedentemente posseduto dal unique_ptr del chiamante.

Control quindi ritorna alla funzione source, il cui unique_ptr è ancora in ambito ma non possiede più nulla. Non c'è nulla che tu possa fare utilmente con questo oggetto eccetto assegnargli un nuovo puntatore da controllare.

    
risposta data 29.09.2014 - 09:35
fonte

Leggi altre domande sui tag