[英]Access violation exception when using socketio-client-c++ and boost asio io_service
我正在嘗試將boost asio庫(1.61)中的io_service與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¹
有什么建議嗎?
¹鏈接已編輯; 鏈接(以前是88M,現在是443k)
因為該行僅使用某物的地址調用公共Win32 API, 所以所有可能導致這種情況的發生是當this
指向隨機某物時(例如,破壞的win_mutex
,其他東西,受保護的內存甚至是nullptr)。
這表示未定義行為 。 UB有數不勝數的可能來源,您的代碼不足以得出任何結論。 但是在Asio中,有99%的時間是由於對象的保留時間不夠長而無法完成異步操作所致。
我已將socketio項目轉換為Dll,關閉了boost自動鏈接,並手動添加了libboost_system-vc140-mt-gd-1_61.lib作為附加依賴項。 然后代碼按預期工作。
但是,如果我將socketio項目切換回靜態庫,則會出現與問題中所述相同的症狀。
請在此處檢查基於Dll的項目文件: http : //ginf.hu/socketio/socketiotest.zip
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.