【问题标题】:curl_slist->next is never null so while loop gets stuckcurl_slist->next 永远不会为空,因此 while 循环会卡住
【发布时间】:2020-02-28 11:08:29
【问题描述】:

我正在开发一个使用 curl 执行 API 请求的 C++ 库。我在尝试使用curl_slistcurl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies); 处理响应中返回的cookie 时遇到问题。

它看起来像一个链表,所以我有一个 current 和 next 属性,我正在检查 next 何时为 NULL 我应该跳出循环但由于某种原因它卡在循环中,看起来它正在做一遍又一遍地使用相同的cookie,但不明白为什么。

struct curl_slist* cookies;
curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);

int i = 1;
std::vector<CookieObj> cookieObjects;
struct curl_slist* current = cookies;
if (current != NULL)
{
    string cookieString = string(current->data);
    CookieObj cookieObj = storeCookie(cookieString);
    cookieObjects.push_back(cookieObj);

    while (current->next != NULL)
    {
        string cookieString = string(current->data);
        CookieObj cookieObj = this->storeCookie(cookieString);
        cookieObjects.push_back(cookieObj);
        current = cookies->next;

        i++;
    }

【问题讨论】:

  • 你的电流在 while 循环中是如何更新的?
  • 不确定你的意思,当前变量在 while 循环结束时更新为 cookies-&gt;next 的值。

标签: c++ c++11 curl cookies


【解决方案1】:

问题出在这一行

current = cookies->next

cookies 总是指向同一个东西,所以cookies-&gt;next 总是指向同一个东西。所以,是的,循环将无限期地继续(假设列表中至少有 2 个 cookie)。你想要:

current = current->next;

代码简化

您当前的代码还会处理第一个 cookie 两次,因为 current 直到最后才会更新。一种可能的代码重排:

for (current=cookies; current; current=current->next) {
   /* process cookie */
}

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2011-07-04
    相关资源
    最近更新 更多