链接问题会导致堆损坏吗?

时间:2019-03-30 02:39:47

标签: c++ access-violation heap-corruption

运行某些属于库的代码时,我的程序遇到访问冲突。我的程序静态链接到库。我可以在其他项目中运行该代码而不会出现问题,但是由于某种原因,它在我的程序中崩溃了。我将代码放在程序的开头,以确保没有其他代码执行过并且仍然崩溃。我认为这不是库的问题,因为在其他情况下该库运行良好。我不知道为什么它崩溃了,我已经尝试了两个星期。这是我已复制到库的github页面的更详细的帖子:

我正在尝试在Visual Studio 2017中使用平台工具集v141构建的MFC项目中使用http_listener。在执行链接到cpprestsdk的代码之前,它运行良好。 cpprestsdk是使用vcpkg安装的,而vcpkg是使用vc141平台工具集构建的cpprestsdk。

我的项目没有已知的预先存在的堆损坏问题,因此这导致堆损坏的事实令人困惑。

这是令人讨厌的代码行:

BOOL CAuthenticationServerApp::InitInstance()
{
    CWinApp::InitInstance();

    utility::string_t port = U("34568");
    utility::string_t address = U("http://127.0.0.1:");
    address.append(port);

    web::uri_builder uri(address);

    auto addr = uri.to_uri().to_string();
---->std::unique_ptr<http_listener> listener = std::make_unique<http_listener>(addr);
    listener->open().wait();
    ...

我的程序执行的第一件事是这段代码。之前没有其他代码,因此没有什么可能导致损坏的堆,因此我认为它与库本身有关。

错误消息:

  

在AuthenticationServer.exe中的0x005B90F8处引发的异常:0xC0000005:访问冲突写入位置0x0B39D000。   引发未处理的异常:写访问冲突。

这是引发异常的调用堆栈。尝试在http_listener_impl contsructor中声明变量时会崩溃:

    AuthenticationServer.exe!std::_Ptr_base<Concurrency::details::_Task_impl<unsigned char> >::_Ptr_base<Concurrency::details::_Task_impl<unsigned char> >() Line 1158  C++
    AuthenticationServer.exe!std::shared_ptr<Concurrency::details::_Task_impl<unsigned char> >::shared_ptr<Concurrency::details::_Task_impl<unsigned char> >(void * __formal) Line 1277 C++
    AuthenticationServer.exe!Concurrency::task<unsigned char>::task<unsigned char>() Line 2963  C++
    AuthenticationServer.exe!Concurrency::task<void>::task<void>() Line 3985    C++
    AuthenticationServer.exe!web::http::experimental::listener::details::http_listener_impl::http_listener_impl(web::uri address) Line 58   C++
    AuthenticationServer.exe!utility::details::make_unique<web::http::experimental::listener::details::http_listener_impl,web::uri>(web::uri && arg1) Line 389  C++
    AuthenticationServer.exe!web::http::experimental::listener::http_listener::http_listener(web::uri address) Line 222 C++
    [External Code] 
    AuthenticationServer.exe!CAuthenticationServerApp::InitInstance() Line 79   C++
    AuthenticationServer.exe!AfxWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 37   C++
    AuthenticationServer.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 26  C++
    [External Code] 

如果我将其放在新的MFC项目或其他类似大小的MFC项目中,则此代码实际上可以正常运行。库是否可能有问题,或者与我的代码有关?该程序的确有一些全局变量,我检查过这些变量,但它们都不包含在其构造函数中分配或释放堆上内存的代码。所以我不知道堆是如何损坏的。该项目链接到其他一些库,并且我确保它们都使用相同的平台工具集构建。这些库没有已知问题,已经使用了多年。我已经将http_listener代码放在另一个与此项目几乎相同,具有相同依赖项的项目中,并且运行良好。

0 个答案:

没有答案