如何解决C++ 覆盖析构函数和成员变量的所有权转移
我不是很精通C++。所以我会尽可能清楚地解释我的问题,当你回答时,请做一些解释。
所以我的问题涉及 2 个类(A 和 B)以及框架中我无权访问的另一个类。 A 有一个指向 B 的指针,B 有一个指向 A 的指针(原始指针)。下面显示了 2 个类之间的交互。
class A {
public:
void method(){
this->b_ = new B(this);
SomeServiceClass::doSomething(std::unique_ptr<B>(this->b_));
}
private:
B *b_;
}
class B {
public:
B(A *a){
this->a_ = a;
}
someOtherMethod(){
}
private:
A *a;
}
所以真正发生的是,A 首先创建,然后在 A 的 method()
中,我创建 B 并将 B 作为 unique_ptr
传递给在另一个框架类中实现的其他方法(我无权访问)。这样我就将 B 的所有权转移给了其他班级。但是在 A 的生命周期中,我想访问 B 的其他方法。这就是为什么我在类 A 中保留一个指向 B 的原始指针。(我可以使用 shared_ptr
代替,但 SomeServiceClass::doSomething
需要 unique_ptr
)。但我的问题是在 A 被摧毁的时候。我应该覆盖 A 的析构函数并分配 this->b_ = null
吗?或者也许删除?提前致谢
解决方法
只要打电话
SomeServiceClass::doSomething(std::unique_ptr<B>(this->b_));
结束,unique_ptr
的析构函数已经销毁了它所指向的内容,潜在地* 使 b_
成为一个无用的悬空指针。不要尝试在其他任何地方读取 b_
,包括不在 A
的析构函数中删除它。
如果一个函数接受一个 unique_ptr
参数,那么该函数声称拥有指向对象的所有权,并且在函数调用之后不允许您尝试访问它。您应该回溯到您的真正目标并重新评估您的方法。
(如果一个函数接受一个 unique_ptr&
参数,那么这个函数可能写得不好。至少,你不应该假设调用后存储的指针与调用前相同。 )
*b_
悬空的替代方案涉及 SomeServiceClass
在某个时刻调用 unique_ptr::release()
。无论哪种情况,您都不再可以访问原始指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。