如何使用C ++智能指针复制更改指针?

时间:2015-12-13 10:44:07

标签: c++ pointers c++11 c++14 smart-pointers

struct A {
   int val;
};
struct B {
    int val2;
    A* ptr = nullptr;
};

int main() {
    A a1, a2;
    B b;
    if (...) { B.ptr = &a1; } else { B.ptr = &a2; }
    return 0;
}

如何用智能ptr代表ptr?它不拥有但需要访问对象a1和a2。 B'使用'只有a1或a2中的一个,以后可以切换。

更改ptr并不意味着a1或a2应该被删除。因此,unique_ptr.reset()不是解决方案。

1 个答案:

答案 0 :(得分:0)

在这种特殊情况下,您不需要智能指针来删除a1或a2。

所以似乎根本不需要智能指针......

除非你想在b超出范围时只对其中一个对象执行一些特殊的清理代码。

在这种情况下,它看起来像这样:

struct A {
   int val = 0;
};

struct cleanup_A {
  void operator()(A* pa) const {
    if (pa) { my_cleanup_action(*pa); }
  }
};

struct B {
  using special_A_ptr = std::unique_ptr<A, cleanup_A>;
  int val2 = 0;
  special_A_ptr ptr = { nullptr, cleanup_A() };
};

int main() {
  A a1,a2;
  B b;
  if (...) { b.ptr.reset(&a1); } else { b.ptr.reset(&a2); }
  return 0;
}

当然,在非标准使用的情况下,所有通常的警告都适用......