假设 Windows C++ 代码中的堆损坏,而在 Linux 中工作得很好 (_CrtlsValidHeapPointer(block)) - libcurl

问题描述

我一直在 Linux(使用 libcurl)中进行应用程序的所有开发,并决定在 Windows 64 位中构建它。一切顺利 - 它编译没有问题,等等......但是当我运行它时,我在调用 libcurl 的 curl_easy_perform() 时崩溃了。更具体地说:

Debug assertion failed! Expression: _CrtlsValidHeapPointer(block).

很困惑我回到 Linux 上运行 valgrind,并且没有损坏的堆块。回到 Windows,我尝试剥离所有应用程序代码并运行标准的 CURL 教程代码:

CURL* req = curl_easy_init();
CURLcode res;  
if (req)
{
    curl_easy_setopt(req,CURLOPT_URL,"www.google.com");
    curl_easy_setopt(req,CURLOPT_FOLLOWLOCATION,1L);
    printf("Passed this point\n");
    res = curl_easy_perform(req);   
    if (res != CURLE_OK)
    {
        fprintf(stderr,"curl_easy_operation() failed : %s\n",curl_easy_strerror(res));
    }
}  

curl_easy_cleanup(req);

你瞧,它仍然以同样的错误崩溃!

我对错误的唯一想法是构建配置中可能有问题?虽然我现在完全不知道它可能是什么......

我得到了这个项目的一个较旧的工作提交,并在该代码库中运行了与上面完全相同的 libcurl 代码,并且没有崩溃......

比较 MSVC 用于编译以前版本和当前版本的“命令行”命令后,它们对我来说似乎完全相同(相同的切换、.libs 和所有)。

有没有人知道在这种情况下可能导致崩溃的原因是什么?

编辑: 堆栈跟踪:

ntdll.dll!00007ffa809c9df2()    Unknown
ntdll.dll!00007ffa8098e03a()    Unknown
ntdll.dll!00007ffa80934365()    Unknown
KernelBase.dll!00007ffa7e3dc99b()   Unknown
ucrtbased.dll!00007ffa394c37d1()    Unknown
ucrtbased.dll!00007ffa394c1b85()    Unknown
ucrtbased.dll!00007ffa394c51c5()    Unknown
ucrtbased.dll!00007ffa394c58c8()    Unknown
vkPhysics_server.exe!Curl_setstropt()   C
vkPhysics_server.exe!Curl_vsetopt() C
vkPhysics_server.exe!curl_easy_setopt() C

更新: 我尝试从先前的提交中调整较旧的 CMake 文件,并且崩溃停止了。我将尝试研究可能导致 CRT 崩溃的两者之间的区别(对于那些感兴趣的人,这里是 the diff

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)