C++重写析构函数和成员变量的所有权转移
C++ Override Destructor and ownership transfer of a member variable
我对C++不是很精通。所以我会尽可能清楚地解释我的问题,当你回答时,请做一些解释。
所以我的问题涉及 2 classes(A 和 B)和另一个 class 在我无权访问的框架中。 A 有一个指向 B 的指针,B 有一个指向 A 的指针(原始指针)。以下显示了 2 classes.
之间的交互
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
传递给另一个 [=23] 中实现的其他方法=] 的框架(我没有访问权限)。这样我就可以将 B 的所有权转让给另一个 class。但是在A的生命周期中,我想访问B的其他方法。这就是为什么我在 class 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()
。无论哪种情况,原来的指针都不再是你的了。
我对C++不是很精通。所以我会尽可能清楚地解释我的问题,当你回答时,请做一些解释。
所以我的问题涉及 2 classes(A 和 B)和另一个 class 在我无权访问的框架中。 A 有一个指向 B 的指针,B 有一个指向 A 的指针(原始指针)。以下显示了 2 classes.
之间的交互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
传递给另一个 [=23] 中实现的其他方法=] 的框架(我没有访问权限)。这样我就可以将 B 的所有权转让给另一个 class。但是在A的生命周期中,我想访问B的其他方法。这就是为什么我在 class 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()
。无论哪种情况,原来的指针都不再是你的了。