如何实现基于RAII的轻量级观察者模式,并利用std::function进行回调管理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计968个文字,预计阅读时间需要4分钟。
手动管理观察者生命周期容 易导致空悬回调,而本 身不具备被调用的对象的所有权,必须配合RAII自动清理。关键在于:
常见错误现象:std::function 捕获了 this 后,被观察对象已销毁,但观察者列表里仍存活着一个调用会 crash 的函数对象。
- 必须用
std::shared_ptr或std::weak_ptr管理被观察对象生命周期(若观察者需访问其状态) - 句柄类型不能是裸指针或引用;推荐用轻量级结构体封装
std::list<...>::iterator或原子计数器 ID - 避免在回调执行期间修改观察者容器(如边遍历边 erase),否则迭代器失效
如何设计可自动注销的订阅句柄(RAII 核心)
句柄本质是一个作用域绑定的“退订令牌”。典型做法是让 subscribe() 返回一个 ObserverHandle 对象,其析构函数调用内部 unsubscribe() 逻辑。
本文共计968个文字,预计阅读时间需要4分钟。
手动管理观察者生命周期容 易导致空悬回调,而本 身不具备被调用的对象的所有权,必须配合RAII自动清理。关键在于:
常见错误现象:std::function 捕获了 this 后,被观察对象已销毁,但观察者列表里仍存活着一个调用会 crash 的函数对象。
- 必须用
std::shared_ptr或std::weak_ptr管理被观察对象生命周期(若观察者需访问其状态) - 句柄类型不能是裸指针或引用;推荐用轻量级结构体封装
std::list<...>::iterator或原子计数器 ID - 避免在回调执行期间修改观察者容器(如边遍历边 erase),否则迭代器失效
如何设计可自动注销的订阅句柄(RAII 核心)
句柄本质是一个作用域绑定的“退订令牌”。典型做法是让 subscribe() 返回一个 ObserverHandle 对象,其析构函数调用内部 unsubscribe() 逻辑。

