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:网络图片,无疑须要去下载图片,我们不须要每次都去下载. 维护一张表 ...
随机推荐
- (转)如何在Excel2013中制作条形码
文章来源:http://www.officezhushou.com/excel2013/3905.html 注意:如果发现条形码不能移动的情况,请点击开发工具-设计模式,那么你就可以移动你的条形码了 ...
- 教程-脚本之Python
1.百度python就可以下载到最新版本(Python3.3) PS:我发现用2.7版本写的py文件用 Python3.3打开时,提示错误(print2.7不需要括号3.3必须加括号).2. ...
- hdoj 1465 不容易系列之一
转 原文网址 http://blog.csdn.net/liwen_7/article/details/7646451 错排问题 错排问题 就是一种递推式,不过它比较著名且常用,所以要熟记! 方法 ...
- hdu 3722 Card Game 二分图的最大权匹配
题目可以转化为2个集合,x集合和y集合,其中的元素是1-n个字符串. 首先预处理点与点的边权,然后直接用二分图的最大权匹配模板. #include<stdio.h> #include< ...
- Java异常处理的误区和经验总结
本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验, ...
- 对XML和YAML文件实现I/O操作
1.文件的打开关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: string filename = "I.xml"; FileStora ...
- Java实现文件的RSA和DES加密算法
根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密) 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密 ...
- .Net Framwork类库
.NET Framework 类库是一个由类.接口和值类型组成的库,通过该库中的内容可访问系统功能.它是生成 .NET Framework 应用程序.组件和控件的基础.类库中的命名空间和命名空间类别在 ...
- 在chrome下安装Proxy SwitchySharp插件
https://chrome.google.com/webstore/detail/dpplabbmogkhghncfbfdeeokoefdjegm
- C++ ORM ODB 入门(三)
本节介绍ODB的事务与 异常. 数据库操作经常涉及到操作多个表格,或者表格中的多行数据.因此必须保证整个过程是原子性的.ODB为数据库的事务提供了易于使用的接口. 使用odb::databse的相关方 ...