环境: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;}
解决方案
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……