Ich fand ursprünglich einig (bösen) Code, um einen Zeiger auf einen Zeiger zu aktualisieren, dies zu tun:Sollte ich unique_ptr <T> durch Referenz hier passieren?
void func(X** ptr2ptr, X* oldx){
X* x2 = new X();
x2->a(oldx->a);
// etc
delete *ptr2ptr;
*ptr2ptr = x2;
oldx = *ptr2ptr;
}
wie man sich vorstellen kann, das ist schrecklich.
Ich refaktorierte die obige Methode und rief sie von einem externen Wrapper, gefolgt von einer anderen Methode, die den aktualisierten Zeiger verwendet (siehe unten). Allerdings scheint es, mein Update-Speicher zu dem Aufruf von anotherMethod vor gelöscht zu werden(), weil ich einen Segmentation Fehler bekommen:
void wrapper(std::unique_ptr<X>& x){
func(x);
anotherMethod(x);
}
void func(std::unique_ptr<X>& x){
std::unique_ptr<X> x2(new X());
// same assignment as before
x = std::move(x2);
}
void anotherMethod(std::unique_ptr<X>& x){
// Seg fault occurs here whilst accessing x class member
}
Kann jemand bitte helfen? Ich dachte, ich würde die richtige Sache mit std :: move() tun und die unique_ptr als Referenz übergeben.
Extrain Code, den Sie zeigen ... 'oldx = * ptr2ptr'? – EFenix