我应该<T>在这里通过引用传递unique_ptr吗?



我最初发现了一些(讨厌的)代码来更新指向指针的指针,这样做:

void func(X** ptr2ptr, X* oldx){
    X* x2 = new X();
    x2->a(oldx->a);
    // etc
    delete *ptr2ptr;
    *ptr2ptr = x2;
    oldx = *ptr2ptr;
}

你可以想象,这太可怕了。

我重构了上面的方法,并从外部包装器调用它,然后是另一个使用更新指针的方法(见下文)。然而,在调用anotherMethod()之前,我的更新内存似乎被删除了,因为我遇到了seg错误:

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是正确的。

旧代码不仅仅是"移动"指针:它将a成员保留在结构中。

试试这样的东西:

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

相关内容

  • 没有找到相关文章

最新更新