2016-07-28 1 views
1

Первоначально я нашел (противный) код для обновления указателя на указатель, как это сделать:Должен ли я передавать unique_ptr <T> по ссылке здесь?

void func(X** ptr2ptr, X* oldx){ 

    X* x2 = new X(); 
    x2->a(oldx->a); 
    // etc 

    delete *ptr2ptr; 
    *ptr2ptr = x2; 
    oldx = *ptr2ptr; 
} 

, как вы можете себе представить, это ужасно.

Я реорганизовал вышеуказанный метод и вызвал его из внешней оболочки, а затем другой метод, который использует обновленный указатель (см. Ниже). Тем не менее, кажется, моя память обновление становится стерта до вызова anotherMethod(), потому что я получаю ошибку сегм:

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 
} 

Может кто-нибудь пожалуйста помочь? Я думал, что делаю правильную вещь, используя std :: move() и передавая unique_ptr по ссылке.

+1

Extrain код показать ... 'oldx = * ptr2ptr'? – EFenix

ответ

1

Старый код был не просто «движущимся» указателем: он содержал элемент a внутри структуры.

Попробуйте что-то вроде этого:

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

    x = new X; 

    x->a = old_a; 
} 
Смежные вопросы