libCURL动态分配buffer——节约内存
libCURL是一个免费的、开源的强大客户端url传输库。支持的平台、协议甚广。平台上有Windows、Linux、FreeBSD;协议上有FTP、HTTP(S)、Telnet、DICT、File等。它是线程安全的,而且支持ipv6。同时,它还是线程安全的。
本文所讲述的内容,要基于Libcurl的基础、具体的了解。官方具体描述地址在:http://curl.haxx.se/libcurl/c/上面。需要多看例子,才能灵活运用。
通常libCURL的数据下载都是通过回调函数下载到buffer中的。其大小一般固定,所以有时候用了不到1/2,有时候却会overflow。这里给出一个简单易用的方法节约内存,并解决溢出。主要思想是使用STL中的list的char*模板,每次回调时都copy到一个分配了一定内存的指针(要注意的是,libCURL给出的是流数据,所以不一定以0结尾,所以有时候用简单的strcpy时,会出现错误,笔者就在这被坑了很多次),其大小为size*nmemb,然后将给出的数据逐个copy后,push_back到链表即可。
使用这些数据时,有可能需要随机存取,但是list不具备这个特征,所以可以先统计出所有数据的总大小,开一个大buffer,存入即可。当然,在此之后,要把所有的list及char指针释放,否则内存还是双倍。
源代码给出如下:
#include <iostream>
#include <list>
#include <curl/curl.h>
using namespace std; size_t callback_get_head(void *ptr,size_t size,size_t nmemb,void *userp); list<char*> toview;
char startht[]={}; int main(void){
cout<<"Enter HTTP adress:";
cin>>startht;
CURL* dcurl=curl_easy_init();
curl_easy_setopt(dcurl,CURLOPT_URL,startht);
curl_easy_setopt(dcurl,CURLOPT_WRITEFUNCTION,callback_get_head);
curl_easy_perform(dcurl);
for (list<char*>::iterator it=toview.begin();it!=toview.end();++it)
cout<<*it;
for (list<char*>::iterator it=toview.begin();it!=toview.end();++it)
delete[] *it;
curl_easy_cleanup(dcurl);
return ;
} size_t callback_get_head(void *ptr,size_t size,size_t nmemb,void *userp){
char* temp=new char[size*nmemb+];
char* ptrtmp=(char*) ptr;
for (size_t i=;i<size*nmemb;++i) temp[i]=ptrtmp[i];
temp[size*nmemb+]=;
toview.push_back(temp);
return size*nmemb;
}
libCURL动态分配buffer——节约内存的更多相关文章
- [转]创建节约内存的JavaBean
转自:创建节约内存的JavaBean 如果编写节约内存的java对象 编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑.但是殊不知, ...
- 节约内存:Instagram的Redis实践(转)
一.问题: 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 三.主流解Ca ...
- C/C++动态分配与释放内存的区别详细解析
以下是对C与C++中动态分配与释放内存的区别进行了详细的分析介绍,需要的朋友可以过来参考下 1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配 ...
- 小白的CTF学习之路8——节约内存的编程方式
今天第二更,废话不说上干货 上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法 ...
- 节约内存:Instagram的Redis实践(转)
Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Inst ...
- 通用的Bitmap压缩算法,进一步节约内存(推荐)
前几天我写了一篇通过压缩Bitmap,减少OOM的文章,那篇文章的目的是按照imageview的大小来压缩bitmap,让bitmap的大小正好是imageview.但是那种算法的通用性比较差,仅仅能 ...
- 节约内存:Instagram的Redis实践
Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Inst ...
- new和delete动态分配和撤销内存
视频:C++引用及new和delete的使用 一.new用法 使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,动态分配失败,则返回 ...
- android图片的缓存--节约内存提高程序效率
如今android应用占内存一个比一个大,android程序的质量亟待提高. 这里简单说说网络图片的缓存,我这边就简单的说说思路 1:网络图片,无疑须要去下载图片,我们不须要每次都去下载. 维护一张表 ...
随机推荐
- FlexSlider插件的详细设置参数 http://www.woothemes.com/flexslider/
http://www.woothemes.com/flexslider/ FlexSlider插件的详细设置参数 $(window).load(function() { $('.flexslider' ...
- 【CSS】Beginner2:Selectors, Properties, and Values
1.Whereas HTML has tags,CSS has selectors. 2.Selector{ properties:value; properties2:value2; } 3 ...
- 分享下VellLock源代码。。。VellLock正式开源
一个月前就准备发布,一直没网,今天在我同学家蹭了个网,就早点发布吧:点我获取源代码 简介地址:http://vell001.clanmark.com/forum/forum.php?mod=viewt ...
- Linux 下svn恢复到某一版本
经常由于坑爹的需求,功能要切回到之前的某一个版本.有两种方法可以实现: 方法1: 用svn merge 1) 先 svn up,保证更新到最新的版本,如20: 2) 然后用 svn log ,查看历史 ...
- 【Java基础】基本类型的包装类作为参数传递是值传递还是引用传递
突然想到这个问题,然后做了下实验,下面以Integer来讲解,其他的忽略: import java.util.Iterator; /** * Created by lili on 15/9/24. * ...
- zoj 3757 Alice and Bob and Cue Sports 模拟
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3757 #include<cstdio> #incl ...
- 【转】bootbox自定义dialog、confirm、alert样式,以及基本设置方法setDefaults中可用参数
<html> <head> <meta charset="utf-8"> <meta name="viewport" ...
- 【三支火把】---一份程序看懂C程序printf()的几种常用用法
闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...
- IOS GCD 使用(一) 简介
一 GCD简介 GCD(Grand Central Dispatch)是苹果为实现并发编程提供的新技术.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一 ...
- 使用Camstudio和KeyCastOW来录屏制作软件Demo视频
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用Camstudio和KeyCastOW来录屏制作软件Demo视频.