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——节约内存的更多相关文章

  1. [转]创建节约内存的JavaBean

    转自:创建节约内存的JavaBean 如果编写节约内存的java对象 编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑.但是殊不知, ...

  2. 节约内存:Instagram的Redis实践(转)

    一.问题:     数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案:      1.通过高速服务器Cache缓存数据库数据      2.内存数据库 三.主流解Ca ...

  3. C/C++动态分配与释放内存的区别详细解析

    以下是对C与C++中动态分配与释放内存的区别进行了详细的分析介绍,需要的朋友可以过来参考下 1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配 ...

  4. 小白的CTF学习之路8——节约内存的编程方式

    今天第二更,废话不说上干货 上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法 ...

  5. 节约内存:Instagram的Redis实践(转)

    Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Inst ...

  6. 通用的Bitmap压缩算法,进一步节约内存(推荐)

    前几天我写了一篇通过压缩Bitmap,减少OOM的文章,那篇文章的目的是按照imageview的大小来压缩bitmap,让bitmap的大小正好是imageview.但是那种算法的通用性比较差,仅仅能 ...

  7. 节约内存:Instagram的Redis实践

    Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Inst ...

  8. new和delete动态分配和撤销内存

    视频:C++引用及new和delete的使用 一.new用法 使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,动态分配失败,则返回 ...

  9. android图片的缓存--节约内存提高程序效率

    如今android应用占内存一个比一个大,android程序的质量亟待提高. 这里简单说说网络图片的缓存,我这边就简单的说说思路 1:网络图片,无疑须要去下载图片,我们不须要每次都去下载. 维护一张表 ...

随机推荐

  1. (转)如何在Excel2013中制作条形码

    文章来源:http://www.officezhushou.com/excel2013/3905.html 注意:如果发现条形码不能移动的情况,请点击开发工具-设计模式,那么你就可以移动你的条形码了 ...

  2. 教程-脚本之Python

    1.百度python就可以下载到最新版本(Python3.3)     PS:我发现用2.7版本写的py文件用  Python3.3打开时,提示错误(print2.7不需要括号3.3必须加括号).2. ...

  3. hdoj 1465 不容易系列之一

    转 原文网址   http://blog.csdn.net/liwen_7/article/details/7646451 错排问题 错排问题 就是一种递推式,不过它比较著名且常用,所以要熟记! 方法 ...

  4. hdu 3722 Card Game 二分图的最大权匹配

    题目可以转化为2个集合,x集合和y集合,其中的元素是1-n个字符串. 首先预处理点与点的边权,然后直接用二分图的最大权匹配模板. #include<stdio.h> #include< ...

  5. Java异常处理的误区和经验总结

    本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验, ...

  6. 对XML和YAML文件实现I/O操作

    1.文件的打开关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: string filename = "I.xml"; FileStora ...

  7. Java实现文件的RSA和DES加密算法

    根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密) 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密 ...

  8. .Net Framwork类库

    .NET Framework 类库是一个由类.接口和值类型组成的库,通过该库中的内容可访问系统功能.它是生成 .NET Framework 应用程序.组件和控件的基础.类库中的命名空间和命名空间类别在 ...

  9. 在chrome下安装Proxy SwitchySharp插件

    https://chrome.google.com/webstore/detail/dpplabbmogkhghncfbfdeeokoefdjegm

  10. C++ ORM ODB 入门(三)

    本节介绍ODB的事务与 异常. 数据库操作经常涉及到操作多个表格,或者表格中的多行数据.因此必须保证整个过程是原子性的.ODB为数据库的事务提供了易于使用的接口. 使用odb::databse的相关方 ...