C++ 链接问题是否会导致堆损坏?

C++ 链接问题是否会导致堆损坏?,c++,access-violation,heap-corruption,C++,Access Violation,Heap Corruption,当运行属于库的某些代码时,我的程序中出现访问冲突。我的程序静态链接到库。我可以在其他项目中毫无问题地运行该代码,但由于某种原因,它在我的程序中崩溃了。我把代码放在程序的最开始,以确保没有其他代码被执行,它仍然崩溃。我不认为这是图书馆的问题,因为它在其他环境下运行良好。我不知道它为什么会崩溃,两周来我一直在想办法。以下是我复制到图书馆github页面的更详细的帖子: 我试图在visual studio 2017中构建的MFC项目中使用http_侦听器,该项目使用平台工具集v141。在执行链接到cp

当运行属于库的某些代码时,我的程序中出现访问冲突。我的程序静态链接到库。我可以在其他项目中毫无问题地运行该代码,但由于某种原因,它在我的程序中崩溃了。我把代码放在程序的最开始,以确保没有其他代码被执行,它仍然崩溃。我不认为这是图书馆的问题,因为它在其他环境下运行良好。我不知道它为什么会崩溃,两周来我一直在想办法。以下是我复制到图书馆github页面的更详细的帖子:

我试图在visual studio 2017中构建的MFC项目中使用http_侦听器,该项目使用平台工具集v141。在执行链接到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();
    ...
BOOL-CAuthenticationServerApp::InitInstance()
{
CWinApp::InitInstance();
实用工具::string_t port=U(“34568”);
实用工具::字符串\U t地址=U(“http://127.0.0.1:");
地址。附加(端口);
web::uri\u生成器uri(地址);
auto addr=uri.to_uri().to_string();
---->std::unique_ptr listener=std::make_unique(addr);
侦听器->打开().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] 
< C++ > AudioTestServer .exe!STD:::YpTrpBase::YpTrpBaseBuy()行1158 C++ AuthLogialServer .exe!STD::SyrdYPPT::SyrdypTR(Value*yAuthRealEngulee)1277 C++ AuthLogialServer .exe!并发::任务::Task()2963行C++ AuthLogialServer .exe!并发::任务::Task()3985行C++ AdvestalServ.exe!Web::HTTP::实验::侦听器::细节:httpListListNuIMP::httpListListNyIMPL(Web:URI地址)58 C++ AuthLogialServer .exe!实用程序::细节:MaxIOrthOutlook(Web::URI和ARG1)389 C++ AddioServer .exe!Web::http:::Time::Histel::HtpIistListNe::httpListListNe:(Web::URI地址)222 C++ [外部代码] AudioServServ.exe!CuxCudioSerServApp::InStistSnices()79行C++ AuthLogServer .exe!AFXWINMAN(HistSnasy**HStutt,HistSnasy**HPRVISTUCTER,CHAR*LPCMDLINE,INTCMCDSH)37行C++ AuthLogiServer .exe!WINMIN(HistSnasy***HealthPase:HistSnxy**HPRVISTUCTER,CHAR*LPCFDLINE,INTCMCDSH)26 C++ [外部代码]
如果我把它放在一个新的MFC项目或另一个类似大小的MFC项目中,这段代码实际上运行得很好。可能是库有问题,还是与我的代码有关?该程序确实有一些全局变量,我检查过,其中没有一个包含分配或释放堆内存的代码uctors。所以我不知道堆是如何损坏的。该项目链接到其他几个库,我确保它们都是使用相同的平台工具集构建的。这些库没有已知问题,已经使用多年。我将http_侦听器代码放在另一个项目中,该项目与此项目几乎相同,使用相同的依赖项,它运行良好。

您能告诉我们有关库、如何调用库、链接器和链接参数/过程的信息吗?好的,这是问题的完整链接。我在我使用的库的github页面上发布了它。您能将最相关的部分直接编辑到帖子正文中吗?堆栈覆盖低级问题本身应该是有用的,即使链接资源因任何原因变得不可用,例如链接腐烂。我肯定看到过堆损坏,这是由于将使用编译器版本a编译的代码与使用编译器版本B编译的对象文件或库链接在一起而造成的。在我的情况下,当使用com编译代码时,会发生这种情况piler版本A将分配一个对象,然后使用编译器版本B编译的代码稍后将释放该对象(我猜在两个编译器版本之间,一些静态包含的内存堆实现细节已经更改)。如果您可以选择从源代码编译所有内容(而不是依赖提供的对象文件),我建议您这样做。如果您的代码包含的头文件的版本与库的版本不同,则很容易导致崩溃。可能是您无意中将较新/较旧的头文件放在了项目的目录中?如果存在不同的http_侦听器声明,则所有赌注都无效