您当前的位置:首页 > 计算机 > 编程开发 > 编程箴言

Linux 下使用libCurl库导致内存增长原因分析

时间:03-13来源:作者:点击数:

最近一直在忙于一个项目,项目上使用到了使用HTTP/POST方法往服务器推送JSON格式数据,通过以下地址链接:https://curl.haxx.se/download.html下载源代码之后,按照要求进行编译,编译libCurl库之后,通过源代码目录中给出的demo学习了一番。把当时测试的demo列出来了:

#include <curl/curl.h>
#include <string.h>
#include <exception>
#include <stdio.h>
#include <unistd.h>

using namespace std;
static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
    size_t realsize = size * nmemb;
    char *buffer = (char *)data;
    if(buffer)
    {
	memmove(buffer, (char *)ptr, realsize);
	printf("buffer:%s\n", (char *)ptr);
    }
    return realsize;
}

void SendHttpPost(CURL *pCurl)
{
	char szJsonData[1024];
	memset(szJsonData, 0, sizeof(szJsonData));
	snprintf(szJsonData, 1024,"{"
			"\"request\":{"
			    "\"action\":\"Status\","
			    "\"content\":{"							                        "\"DEVICE\":\"1234567890\","
                                   "\"STATE\":\"Online\","
				    "\"DYJD\":\"null\","
				    "\"DYWD\":\"null\""
				"}"
			    "}"
		        "}");
	try 
	{
		CURL *pCurl = NULL;
		CURLcode res;
		char recv[128] = {0};
		//this will init the winsock stuff
		curl_global_init(CURL_GLOBAL_ALL);
 
		// get a curl handle
		pCurl = curl_easy_init();
		if (NULL != pCurl) 
		{
			// 设置超时时间为1秒
			curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 1);
			curl_easy_setopt(pCurl, CURLOPT_URL, "http://192.168.1.7:8888/videotest/unAuth/State");
 
			// 设置http发送的内容类型为JSON
			curl_slist *plist = curl_slist_append(NULL,"Content-Type:application/json;charset=UTF-8");
			curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, plist);
 
			// 设置要POST的JSON数据
			curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, szJsonData);
			//curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
			//curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, (void*)recv);
			
			// Perform the request, res will get the return code 
			res = curl_easy_perform(pCurl);
			// Check for errors
			if (res != CURLE_OK) 
			{
				printf("curl_easy_perform() failed:%s\n", curl_easy_strerror(res));
			}
			// always cleanup
			printf("curl_easy_perform success! receive json data\n");
			curl_easy_cleanup(pCurl);
		}
		curl_global_cleanup();
	}
	catch (std::exception &ex)
	{
		printf("curl exception %s.\n", ex.what());
	}

}

int main(int argc, char *argv[]) 
{
	int nCount = 3000;
	while(nCount--)
	{
		SendHttpPost(pCurl);
		printf("nCount--: <%d>\n", nCount);
		usleep(200000);
	}
	
	while(1)
	{
		printf("xunhuan!!!!\n");
		usleep(1000000);
	}
	
	return 0;
}

上述代码测试后发现使用top命令查看该进程的资源使用情况,发现RES一列会隔一段时间增长0.2M左右,测试发现,使用libCurl库时,有内存没有释放;具体内存增长的原因是因为没有使用curl_slist_free_all(plist);该函数进行释放资源导致。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门