Ad esempio, sono abbastanza sicuro che funzioni.Se prendo un puntatore raw di un unique_ptr e poi utilizzo reset, il puntatore raw è ancora garantito valido?
int foo = 51;
int* bar = &foo;
foo = 3;
Quindi la barra è ancora valida e *bar == 3
.
Che dire se diciamo
std::unique_ptr<int> foo(new int(51)); // should probably use make_unique
int* bar = foo.get();
foo.reset(new int(3));
Perchè sono garantiti che *bar == 3
? Oppure sto causando un comportamento indefinito continuando alla barra di riferimento?
Se imposto 'bar = foo.get()' e poi decido che cambierò pippo, posso semplicemente chiamare 'foo.release()' e lasciare che la barra assuma la proprietà senza assegnazione esplicita? Non riesco davvero a pensare a un caso d'uso, ma sono curioso di sapere se funzionerà correttamente. – wrhall
@wrhall: No, non puoi. Sarebbe tremendamente pericoloso. Unique_ptr * always * possiede il puntatore. Questo è il solo scopo. Puoi solo evitarlo usando 'release()', che è una funzione terribile che non dovresti mai chiamare. – Puppy
@Puppy anche se è una cattiva pratica, è tecnicamente corretto? Guardando la documentazione, sembra che 'release()' * rilasci la proprietà dell'oggetto gestito, se presente. get() restituisce 'nullptr' dopo la chiamata. * Quindi mi sembra che' release() 'esegua davvero' return managed_ptr; 'e contrassegna' unique_ptr' come "non-managing", quindi future 'get()' ritorna 'nullptr'. Sai se questo è davvero il caso? – vsoftco