首頁  >  問答  >  主體

c++ - boost异常

这个问题有点奇怪,也不知道怎么描述。
报错的位置是在VC\crt的源码dbgheap.c中的504行,应该是用malloc申请内存的时候报错。
源码和报错信息如下

int main()
{
try
{
boost::asio::io_service io_service;
boost::asio::ip::tcp::endpoint en(boost::asio::ip::address::from_string("127.0.0.1"), 10086);
TcpServer server(io_service, en);
server.run();
}
catch (std::exception& e)
{
printf("caught exception: %s", e.what());
}
while(true)
{
printf("please enter a command: |quit|new|stock|sold| \n");

}
return 0;

}

void TcpServer::run()
{
printf("start io_service thread!\n");
boost::shared_ptr thread(new boost::thread(boost::bind(&io_service::run, &m_Service)));
m_ServiceThreads.push_back(thread);
}

如果我把try catch扩展到连while循环都包括进去,则不会出现任何异常。而且一切正常。。代码如下:

int main()
{
try
{
boost::asio::io_service io_service;
boost::asio::ip::tcp::endpoint en(boost::asio::ip::address::from_string("127.0.0.1"), 10086);
TcpServer server(io_service, en);
server.run();

    while(true)
    {
        printf("please enter a command: |quit|new|stock|sold| \n");
    }
}
catch (std::exception& e)
{
    printf("caught exception: %s", e.what());
}
return 0;

}

有人能告诉我这是为什么吗?或者问题是出在哪呢?
FYI:我不想阻塞主线程,所以不希望用thread.join()

阿神阿神2765 天前614

全部回覆(2)我來回復

  • 迷茫

    迷茫2017-04-17 11:35:30

    在手機上寫的答案,就沒有運行程式碼了,光靠看的。
    看來多半是多執行緒和物件生命週期的問題,你第二個程式碼把try提出來以後,io_service在運行到while語句的時候是沒有析構的,這點不同於第一個程式碼。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 11:35:30

    這個異常跟boost沒有關係,而是物件生命週期的問題,TCPServer物件只在try的下面{}的範圍內生存,一旦try的程式碼區塊執行完畢,物件也就銷毀了。 TCPServer物件銷毀後沒有正確停止線程,你的線程裡可能還在運行並使用了這個銷毀物件裡面的資源,所以導致了異常。

    try
    { 
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::endpoint en(boost::asio::ip::address::from_string("127.0.0.1"),10086);
        TcpServer server(io_service, en);
        server.run();
    }
    catch (std::exception& e)
    {
        printf("caught exception: %s", e.what());
    }
    
    //server对象在这里已经析构销毁了
    while(true)
    {
        printf("please enter a command: |quit|new|stock|sold| \n");
    }
    return 0;
    

    回覆
    0
  • 取消回覆