【发布时间】:2021-07-26 19:02:23
【问题描述】:
有没有办法防止一个特定对象在另一个对象仍然存在时被销毁, 明确地让第二个对象的类知道第一个对象?
这是一个例子:
class A { /* A creates B*/ };
class B {};
int main() {
auto spA = std::make_shared<A>();
auto spB = spA->getB();
spA.reset();
spB->DoSomething();
}
在spA.reset() 之后,我希望至少有一个对spA 指向的对象的引用。或者,换句话说:我只想在调用spB->DoSomething() 之后销毁spA 指向的对象。
但是,一个重要的先决条件是不允许B“知道”A(例如,不允许持有指向它的指针/引用)。
据我了解,共享指针提供了一些有助于解决此问题的功能,但我不确定是哪一个。
编辑:
A和B的简要结构如下:
class A
{
public:
A()
{
m_B = B::FactoryB();
}
std::shared_ptr<B> getB()
{
return m_B;
}
private:
std::shared_ptr<B> m_B;
};
class B
{
public:
static std::shared_ptr FactoryB()
{
return std::make_shared<B>();
}
};
EDIT2(我的解决方案):
因此,使用@MSalters 提供的建议,我能够找到适合我的解决方案。在这种情况下,它比预期的要简单得多,因此我只需要调整A::getB():
std::shared_ptr<B> getB()
{
std::shared<B> spBAlias(this->shared_from_this(), m_B.get());
return spBAlias;
}
这里,A::getB() 创建并返回B 类型的共享指针spBAlias(使用别名构造函数),而不只是返回m_B,这会影响A 对象的引用计数(由this->shared_from_this())。因此,在main 中调用spA.reset() 可以将spA 的使用从2 减少到1,从而使spB->DoSomething() 的调用成为可能。要使用shared_from_this(),A需要继承自std::enable_shared_from_this<A>:
class A : public std::enable_shared_from_this<A> { /* ... */ }
【问题讨论】:
-
我觉得你的问题有点混乱。如果您仍然希望对象还活着,为什么还要调用
spA.reset()? -
您似乎正试图将手动生命周期管理硬塞进
shared_ptr。这几乎可以保证不会有好的结局。 -
@AndyG,例如,这只是对“不需要的”访问的模拟(例如,另一个函数/客户端试图删除另一个仍在使用的组件)。
-
没有办法做到这一点并遵守这些严格的要求。 C++ 不能以这种方式工作。有可能做到这一点,但只需对这些要求稍作改动即可。
-
对我来说,您似乎希望两者之间有明确的关系,但两者之间没有明确的关系,但也许我只是误解了您想要实现的目标
标签: c++ shared-ptr ownership-semantics