绑定函数中的 C++ socketio 分段错误

C++ socketio segmentation fault in bound function

这是我关于 Whosebug 的第一个问题,我是 C++ 的新手。我希望大家能原谅我对这里可能很明显的问题的无知,但我很茫然。

基本上,我只是想在我的 C++ 客户端中捕获由 nodejs 服务器发出的事件。我已经成功地编译了我的二进制文件(导入的 boost 和 socketio)和许多困难。我正在尝试通过 websocket 连接发出事件,但我首先需要确保连接成功。我一直主要关注 link 中的教程:https://socket.io/blog/socket-io-cpp/. I've also been following the source code, which can be found here: https://github.com/socketio/socket.io-client-cpp/tree/master/examples/QT

出于某种原因,当我在我的绑定函数(在 SocketHandler class 的 onConnected 函数中)访问我的 _io 指针时,我似乎遇到了段错误。

我确定我在做一些愚蠢的事情,但我们将不胜感激。也许我误解了 std::bind 函数的用法?我来自一个主要 javascript 的世界。

main.cpp

  #include "sockethandler.h"

  int main()
  {
      SocketHandler sh;
  }

sockethandler.cpp

#include <iostream>
#include "sockethandler.h"
const char name[13] = "raspberry_pi";

SocketHandler::SocketHandler() :
    _io(new client())
{
    using std::placeholders::_1;
    _io->set_socket_open_listener(std::bind(&SocketHandler::OnConnected,this,_1));
    _io->connect("http://127.0.0.1:3000");
    _io->socket()->on("bot-command", [&](sio::event& ev) {
        std::cout << "GOT IT!" << "\n";
        //handle login message
        //post to UI thread if any UI updating.
    });
}

void SocketHandler::OnConnected(std::string const& nsp)
{
    std::cout << "CONNECTED" << "\n";
    // I can access a private class variable such as _a as a string 
    // here
    _io->socket()->emit("join");
}

sockethandler.h

#ifndef SOCKETHANDLER_H
#define SOCKETHANDLER_H

#include <sio_client.h>

using namespace sio;

class SocketHandler {
    public:
        explicit SocketHandler();

    private:
        void OnConnected(std::string const& nsp);
        std::unique_ptr<client> _io;
};

#endif // SOCKETHANDLER_H

很确定您使用的套接字 io 库是线程化的。您的对象已创建,设置回调(包括对自身的引用),构造函数退出,主退出和自动(堆栈)变量 sh 被销毁。然后套接字 io 库尝试 运行 不再引用有效对象的回调,它崩溃了。在你的 SocketHandler 析构函数中放置一个调试语句,比如 cerr << "destructor called" << endl; 我很确定你总是会在程序崩溃之前看到它被调用。

为了向自己证明这一点,将 sleep(10); 或其他任何代码作为主代码的最后一行以阻止它退出,我猜你会看到你的程序成功。