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[256]={0};

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 0;
}

size_t callback_get_head(void *ptr,size_t size,size_t nmemb,void *userp){
    char* temp=new char[size*nmemb+1];
    char* ptrtmp=(char*) ptr;
    for (size_t i=0;i<size*nmemb;++i)  temp[i]=ptrtmp[i];
    temp[size*nmemb+1]=0;
    toview.push_back(temp);
    return size*nmemb;
}
时间: 2024-12-07 15:49:50

libCURL动态分配buffer——节约内存的相关文章

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

add by zhj:本文只翻译了一部分,更多分析要参考英文原文 译文:节约内存:Instagram的Redis实践 英文原文:Storing hundreds of millions of simple key-value pairs in Redis Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Instagram团队如何使用Redis来解决这个问

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

一.问题: 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 三.主流解Cache和数据库对比: 从以上各数据可知,对于我们产品最可行的技术方案有两种: 1.Memcached         内存Key-Value Cache 2.Redis                     内存数据库 四,节约内存:Instagram的Redis实践 Instagram可以说是网拍App的始祖级应用,也是当

通用的Bitmap压缩算法,进一步节约内存

前几天我写了一篇通过压缩Bitmap,减少OOM的文章,那篇文章的目的是按照imageview的大小来压缩bitmap,让bitmap的大小正好是imageview.但是那种算法的通用性比较差,仅仅能适合fit_xy的情况.对此我进一步分析了下这个问题,并且参考了Volley的源码,最终得出了结论:如果你要让这个压缩后的bitmap完全适合多种imageview拉伸模式,你就必须重写拉伸模式的算法,但这过于小题大做了.讨巧一点的办法就是让这个imageview不完全按照imageview的长宽进

c与c++分别是怎样动态分配和释放内存的,有什么区别

C语言 c语言提供内存动态分配的函数有:malloc.calloc.realloc,在使用这些函数时必须包含其头文件,分别为:<malloc.h>.<stdlib.h>.<alloc.h> 1) malloc 函数:void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化. 2) calloc 函数: void *call

Node Buffer/Stream 内存策略分析

在Node 中,Buffer 是一个广泛用到的类,本文将从以下层次来分析其内存策略: User 层面,即Node lib/*.js 或用户自己的Js 文件调用 new Buffer Socekt read/write File read/write User Buffer 在 lib/buffer.js 模块中,有个模块私有变量 pool, 它指向当前的一个8K 的slab : Buffer.poolSize = 8 * 1024; var pool; function allocPool()

New动态分配 Delete 释放内存

在C++中,对于变量和对象都是编译器在编译时分配好的,对于数组初始化时,无法确定多少内存,很容意造成大开小用的情况. new  动态分配 一般格式:1. 指针变量名 =new  类型标识符; 2.指针变量名  =new  类型标识符(初始值); 3.指针变量名  =new  类型标识符 [内存单元个数];   开辟数组的定义方法 new运算符返回的是一个指向所分配类型变量的指针. delete 释放内存 一般格式:1.delete p; 2.delete []p; 删除变量p的地址空间,释放in

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

现在android应用占内存一个比一个大,android程序的质量亟待提高. 这里简单说说网络图片的缓存,我这边就简单的说说思路 1:网络图片,无疑需要去下载图片,我们不需要每次都去下载. 维护一张表,表里面放url 对应 存储的文件名 实现方法就是先拿到要下载的url,拿这个url去数据库匹配,如果有这张图片,那就不需要重新去下载了,直接通过数据库,去拿到图片的位置,然后从本地把图片加载出来就OK了.没有这张图片的时候去下载一下,并且存一下数据库 好处:这么做的好处很明显,下载过的图片不需要重

MATLAB中选择合适的数据类型以节约内存

在做大矩阵的运算,发现占用太多内存,于是在好友jcyao的提醒下,将double类型改为uint8类型内存是原来的1/8.(我的问题可以使用整形,其他问题不一定使用).在网上搜到一篇如何选择变量类型的文章,写的很清楚,先摘下来.其网站matlabtips.com 上面有很多好的建议和优化方法. Choose your variables wisely- Posted on March 21, 2012 by Jerome I am stuck home with a big fever so I

python的__slots__节约内存的魔法

在Python中,每个类都有实例属性.默认情况下Python用一个字典来保存一个对象的实例属性.这非常有用,因为它允许我们在运行时去设置任意的新属性. 然而,对于有着已知属性的小类来说,它可能是个瓶颈.这个字典浪费了很多内存.Python不能在对象创建时直接分配一个固定量的内存来保存所有的属性.因此如果你创建许多对象(我指的是成千上万个),它会消耗掉很多内存. 不过还是有一个方法来规避这个问题.这个方法需要使用__slots__来告诉Python不要使用字典,而且只给一个固定集合的属性分配空间.