2016-07-28 21 views
1

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.

+1

Extrain Code, den Sie zeigen ... 'oldx = * ptr2ptr'? – EFenix

Antwort

1

Der alte Code war nicht nur "wandern" Zeiger: Es behielt die a Mitglied in der Struktur.

so etwas wie dieses Versuchen:

void func(std::unique_ptr<X>& x){ 
    auto old_a = x->a; 

    x = new X; 

    x->a = old_a; 
}