使用socketio-client-c++和boost asio io_service时的访问冲突异常

Access violation exception when using socketio-client-c++ and boost asio io_service

本文关键字:service 访问冲突 异常 io socketio-client-c++ boost asio 使用      更新时间:2023-10-16

我试图使用io_service从boost asio库(1.61)与socketio-client-c++,但我的代码抛出访问违反异常,经过数小时的调试,我无法找出是什么原因。在win_mutex.hpp中的以下位置抛出异常:

void lock()
{
 -> ::EnterCriticalSection(&crit_section_);
}

代码很简单:

int main(int argc, char* argv[]) {
    boost::asio::io_service io_service;
    auto io_service_work = std::make_shared<boost::asio::io_service::work>      (io_service);
    sio::client client_;
    client_.connect("http://localhost:1337");
    // io_service.run();
}

我想从main中使用io_service,而socketio也在内部使用io_service,这可能是问题的原因。

您可以下载完整的项目与socketio源代码和二进制包含在这里:http://stackoverflow-sehe.s3.amazonaws.com/7f1afa6a-883f-4941-8371-31ccbd8514a5/socket-io.zip¹

任何建议吗?

¹link redacted;链接

因为这行只是用的地址调用一个公共的Win32 API ,所有可能导致这种情况发生的是当this指向随机的东西(例如一个被破坏的win_mutex,别的东西,受保护的内存甚至nullptr)。

表示未定义行为。UB有无数可能的源代码,您的代码不足以得出任何结论。但是在Asio中,99%的情况是由于没有保持对象足够长的时间来完成对它的异步操作。

我已经将socketio项目转换为Dll,关闭boost自动链接,并手动添加libboostrongystem-vc140-mt-gd-1_61。Lib作为附加依赖项。然后代码按预期工作。

但是,如果我将socketio项目切换回静态库,则会出现与问题中描述的相同的症状。

请在这里检查基于Dll的项目文件:http://ginf.hu/socketio/socketiotest.zip