ev-glaze-weak-ptr-websocket-003¶
| 字段 | 值 |
|---|---|
| 项目 | stephenberry/glaze |
| 固定 commit | d78832c82289 |
| 路径 | include/glaze/net/websocket_client.hpp |
| 行段 | L269-L282 |
| 特性 | std::shared_ptr 与 std::weak_ptr |
| 许可证 | MIT |
| 代码来源 | 项目源码 |
| 级别 | manual |
| 审核 | zyuhao7 @ 2026-10-30 |
| 测试代码 | 否 |
| 发现方式 | manual |
用法¶
异步回调只保存 weak_ptr,调用前 lock 并检查对象是否仍存活
为什么典型¶
异步操作由库执行,回调可能晚于客户端析构到达;weak_ptr 让回调不延长生命周期,lock 失败就直接返回。
摘录¶
std::weak_ptr<impl> weak_self = weak_from_this();
resolver_->async_resolve(
url.host, std::to_string(url.port),
[weak_self, url](std::error_code ec, asio::ip::tcp::resolver::results_type results) {
auto self = weak_self.lock();
if (!self) return; // Client was destroyed
if (ec) {
if (self->on_error && *self->on_error) (*self->on_error)(ec);
return;
}
self->on_resolved(url, results);
});
备注¶
生产路径;捕获 weak_ptr 而非 shared_ptr,避免异步回调把客户端锁在堆上,也避免析构后访问悬空对象。