【发布时间】: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_init和curl_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