boost异常

发布于 2022-08-29 21:48:14 字数 1615 浏览 30 评论 0

这个问题有点奇怪,也不知道怎么描述。
报错的位置是在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()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吃不饱 2022-09-05 21:48:14

在手机上写的答案,就没有运行代码了,光靠看的。
看样子多半是多线程和对象生命周期的问题,你第二个代码把try提出来以后,io_service在运行到while语句的时候是没有析构的,这点不同于于第一个代码。

離殇 2022-09-05 21:48:14

这个异常跟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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文