c++ - mfc中调用curl_slist_free_all时报错:读取位置 0x3d646e65 时发生访问冲突

 __wolf狼 发布于 2022-11-26 20:10

环境:Win7 64位+VS2008
问题:在mfc中进行libcurl编程的时候,发现无法释放发送给服务端的header信息

问题代码如下

//释放资源
curl_slist_free_all(headers);

报错:0x586244d6 处最可能的异常: 0xC0000005: 读取位置 0x3d646e65 时发生访问冲突

完整代码

ReturnInfo CCSDNDlg::LoginServer(CString strUser,CString strPass)
{
    ReturnInfo returnInfo;
    returnInfo.bReturn = FALSE;

    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;
    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    if(curl){
        //初始化cookie引擎
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
        curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION, 1L);

        //http请求头
        headers = curl_slist_append(headers,"User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0"); //模拟浏览器
        headers = curl_slist_append(headers,"Host:passport.csdn.net");
        headers = curl_slist_append(headers,"Accept:*/*");
        headers = curl_slist_append(headers,"Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
        headers = curl_slist_append(headers,"Accept-Encoding:gzip, deflate");
        headers = curl_slist_append(headers,"X-Requested-With:XMLHttpRequest");
        headers = curl_slist_append(headers,"Referer:https://passport.csdn.net/account/loginbox?callback=logined&hidethird=1&from=http%3a%2f%2fwww.csdn.net%2f");
        headers = curl_slist_append(headers,"Connection:keep-alive");

        //设置要发往服务器的cookie
        curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "mycookie.txt");      //把服务器发过来的cookie保存到mycookie.txt

        //发送http请求头
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        char url[128];
        sprintf(url,"http://passport.csdn.net/ajax/accounthandler.ashx?t=log&u=%s&p=%s&remember=0&f=http%3A%2F%2Fwww.csdn.net%2F&rand=0.47590136872096434",strUser,strPass);
        curl_easy_setopt(curl, CURLOPT_URL,url);

        string content;
        //设置回调函数
        res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);

        //执行http请求
        res = curl_easy_perform(curl);

        string returnVal;
        Utf8ToMb((char*)content.c_str(),content.length(),returnVal);
        int pos = returnVal.find("\"status\":true");
        if ( pos >= 0){
            returnInfo.bReturn = TRUE;
        }else{
            int nStartPos = returnVal.find("error\":");
            int nEndPos   = returnVal.find("data\":",nStartPos);
            returnInfo.strErrorInfo = returnVal.substr(nStartPos+8,nEndPos-nStartPos-11);
        }

        //释放资源
        curl_easy_cleanup(curl);
        curl_slist_free_all(headers);
        headers = NULL;
    }
    curl_global_cleanup();
    return returnInfo;
}
1 个回答
  • char url[128];
    sprintf(url,"http://passport.csdn.net/ajax/accounthandler.ashx?t=log&u=%s&p=%s&remember=0&f=http%3A%2F%2Fwww.csdn.net%2F&rand=0.47590136872096434",strUser,strPass);

    这个URL长度肯定不止128……

    2022-11-26 21:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有