当我之前实现观察者模式时,我总是习惯在侦听器内部保存对所有者的引用。在听众的 ctor 中,我使用了注册,在 dtor 中我使用了注销。
但是这一次,我不想为在此类之间保持弱耦合提供参考。
我想出了一个带有弱ptr的实现。 我的问题是,是否可以在没有使用弱ptr取消订阅方法的情况下实现观察者模式?有什么情况会给我带来麻烦吗?
是的,对观察者使用weak_ptr
是很自然的。
但是,您的实现存在数据竞争,其中elem
在循环期间过期,您可能希望改为
for (auto elem : listenerList)
{
auto locked = elem.lock();
if (locked) { locked->update(val); }
else { anyExpired = true; }
}