【问题标题】:Why does curl_easy_cleanup() throw an exception?为什么 curl_easy_cleanup() 会抛出异常?
【发布时间】:2021-04-28 14:44:59
【问题描述】:

我刚刚开始研究libcurl 并遇到了 curl_easy_cleanup() 函数的奇怪行为。该程序的任务很原始:从站点获取 html 代码并将其放入标准输出中。

#include <cstdio>
#include <clocale>
#include "curl\curl.h"

int main()
{
    setlocale(LC_ALL, ".utf8");        // deleting this doesn't help
    curl_global_init(CURL_GLOBAL_ALL);
    CURL* curl = curl_easy_init();
    CURLcode res;

    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, "https://cbr.ru/currency_base/daily/");
        res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            printf("Error\n");
        }
    }
    curl_easy_cleanup(curl);        // crash
    curl_global_cleanup();
    return 0;
}

一切顺利,我有正确的输出,但 curl_easy_cleanup 抛出访问冲突异常和程序崩溃。为什么它会这样做,我该如何解决这个问题?谢谢。


UPD:我使用 Visual Studio 2019 并编译为 C++。我得出的结论是,这个问题是该网站使用 https(不是 http)。我尝试了几个http站点,效果很好。那我应该如何对待 https 网站呢?

【问题讨论】:

  • ".utf8" 是一个非常奇怪的语言环境。在任何情况下,按原样编译它并运行只会导致“错误”,而不会崩溃。无法重现。除了奇怪的语言环境之外,显示的代码没有任何明显错误。
  • @SamVarshavchik 似乎完全受支持:“例如,setlocale(LC_ALL, ".utf8") 将使用当前默认的 Windows ANSI 代码页 (ACP) 作为语言环境,使用 UTF-8 作为代码页。” docs.microsoft.com/en-us/cpp/c-runtime-library/reference/…(这似乎是一个 Windows 程序)但它在我的 Mac 上也能正常工作,所以......
  • 它适用于我并检索列出的网页。你在哪个平台?你是怎么编译这个的?我使用 Visual Studio 2019 并编译为 C++。你错过了curl_global_initcurl_global_cleanup,我一直在我的程序中使用它们。
  • 我在 Linux 上编译它没有问题。我只需要将curl\curl.h 更改为curl/curl.h
  • @RetiredNinja 我也使用 VS2019 并编译为 C++。我已经添加了这两个功能,但这没有帮助。顺便说一句,curl_easy_init 自动调用curl_global_init(虽然不推荐)curl.se/libcurl/c/curl_easy_init.html

标签: c++ windows curl visual-c++ libcurl


【解决方案1】:

原来问题出在安装错误。我已经使用 this 指南(通过 vcpkg)重新安装,现在一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2015-12-24
    • 2015-04-03
    相关资源
    最近更新 更多