我有一个简单的基于教程的boost asio代码,当从exe内调用时效果很好,但使用LoadLibrary从dll内运行时崩溃。它在boost代码而不是我的代码内崩溃。它将在其线程互斥函数内部崩溃90%的时间。与exe相比,在dll中执行代码时是否有任何限制?

这是我的代码:

Connection::Connection(boost::asio::io_service& ioservice)
    : m_Socket(ioservice)
    , m_Resolver(ioservice)
{
}

void Connection::ConnectTo()
{
    boost::asio::ip::tcp::resolver::query query("www.google.com", "http");
    boost::asio::ip::tcp::resolver::iterator iterator = m_Resolver.resolve(query);
    boost::asio::ip::tcp::endpoint endpoint = *iterator;

    // crashes here inside async_connect
    m_Socket.async_connect(endpoint,
        boost::bind(&Connection::HandleConnect, shared_from_this(),
        boost::asio::placeholders::error, ++iterator));

}

void Connection::HandleConnect( const boost::system::error_code& e,
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator )
{
    // never reaches here
}

有任何原因为什么此代码将在dll中而不是exe中崩溃?请注意,只有异步调用会崩溃。同步通话正常

谢谢

最佳答案

在静态链接库中运行的DLL函数崩溃的典型原因是内存管理器。 DLL将获得它自己的内存管理器副本,除非您在各处动态链接RTL。因此,必须使用创建它的内存管理器销毁每个跨越边界的对象,否则销毁此类对象会导致崩溃。

07-24 09:46
查看更多