c++ - 通过引用 lambda 传递weak_ptr
问题描述
我在程序运行时观察到未定义的行为,我怀疑它可能是由weak_ptr 引起的。
调用了套接字的发送函数,但它无法映射套接字,但是如果我删除 Lambdas,它可以映射套接字。
工作函数之前是同步的,没有任何问题,但现在在将 Lambda 添加到工作函数后会导致未定义的行为。
这真的不安全吗?如果是这样,我应该改用什么?
// Global Socket
std::shared_ptr<s::Channel> gSocket;
void worker(std::weak_ptr<s::Channel> socket)
{
auto &request = requests.emplace_back();
request.onMessage([&](std::string data) {
if (auto channel = socket.lock())
{
channel->send(data);
}
})
request.onError([&](std::string data) {
if (auto channel = socket.lock())
{
channel->send(data);
}
})
}
int main() {
broker->onInit([&]() {
// Shared PTR
gSocket = createConnection();
gSocket->onOpen([&, wS = make_weak_ptr(gSocket)]() {
if (auto c = wS.lock())
{
worker(c);
}
});
})
broker.init();
}
解决方案
如评论中所述
std::weak_ptr<s::Channel>
socket是一个局部变量,函数返回后销毁。稍后调用回调时,它指的是一个不存在的weak_ptr 实例。
您可以通过按值捕获来修复它socket
:
void worker(std::weak_ptr<s::Channel> socket)
{
auto &request = requests.emplace_back();
request.onMessage([socket, &request](std::string data) {
if (auto channel = socket.lock())
{
channel->send(data);
}
})
request.onError([socket, &request](std::string data) {
if (auto channel = socket.lock())
{
channel->send(data);
}
})
}
推荐阅读
- python - 需要从另一个 txt 文件在现有 txt 文件中创建一个新列
- r - 如何根据多列值(重复值和字符串值)从 tibble 中删除行
- c# - WPF:仅更改 ListBox 中最后一项的 CornerRadius
- javascript - 根据单选按钮和复选框选择显示不同的文本
- c - scanf和gets有什么区别?
- websocket - 为什么我的 Socket.IO 服务器没有响应我的 Firecamp 和 C# 客户端?
- python - 如何在 Apache 服务器上托管 Dash 应用程序?
- c# - 如何使用 Powershell 在 Windows 10 上处理 LogonHours 属性?
- virtual-machine - 如何实现像 virtualbox 这样的虚拟化应用程序?
- lisp - 过滤掉除数字以外的任何值