使用socketio-client-c++和boost asio io_service时的访问冲突异常
Access violation exception when using socketio-client-c++ and boost asio io_service
我试图使用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
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- C++ 读取访问冲突,0xCDCDCDCD