以下是描述所有权意图的好方法(不使用shared_ptr吗?)
class Z { };
class A
{
unique_ptr<Z> m_z; //want to say 'I own Z'
};
class B
{
B(A & a)
{
m_z = a._z.get();
}
Z* m_z; //want to say 'I do not own Z, just a ref...'
}
另外,B._ z可以悬空。有没有办法在不诉诸shared_ptr和weak_ptr的情况下纠正问题?
答案 0 :(得分:2)
unique_ptr确定所有权。如果仍然发出指向该对象的原始指针并将其存储在其他位置(因此技术上是共享的),那么这可能会使读者感到困惑。
如果你不想使用shared_ptr并且不想拥有悬空指针,那么观察者模式可能会帮助你。使用它可以确保在其_z被销毁时发出B类实例的信号。这可能比A中的shared_ptr和B中的weak_ptr贵一些。对于线程安全示例,请尝试... Boost.Signals2。
我同意weak_ptr的使用看起来很难看,但观察者的事情也会给代码增加一些膨胀。