跳转至

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,避免异步回调把客户端锁在堆上,也避免析构后访问悬空对象。

查看固定 commit 源码 · 返回证据索引