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()不是解决方案。
答案 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;
}
当然,在非标准使用的情况下,所有通常的警告都适用......