转:原文: http://blog.csdn.net/zmxiangde_88/article/details/8038150

-------------------------------------------------------------------------------

博文主要内容来自APR_POOL的帮助文档

APR的意思是Apache可移植运行库,是Apache portable Run-time Libraries的缩写,主要是为编写上层的应用程序提供一个跨平台使用的接口,在早期的时候,为了应用程序在多个操作系统和平台上能够运行,应用本身需要处理各种具体的细节,针对不同的平台调用不同的处理函数等等,到了今天,这些操作平台之间不同的调用以及细节处理都有一个通用的处理方式,这就是APR库。

在实际的应用程序开发过程中,经常有内存操作,在Apache模块开发时,内存的操作可以通过这个池来完成。就是在需要内存的时候,从这个池上分配,当不再需要使用任何内存时,可以将这个池释放,这样就可以释放这个池上所有的内存(那些被多次分配的,可以一次被释放了,但我们需要为内存注册一个释放内存的操作)。事实上,每个HTTP  request结构都有一个apr_pool_t结构实例,后者表示内存池的管理实例,也是Apache中资源管理的核心。

一,三个基本的API

  1. APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool,
  2. apr_pool_t *parent);
  3. APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size);
  4. APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p);

上面三个API分别表示创建一个APR池,从池中分配内存,释放APR池,是一个内存池的最基本的三个操作。

二,一个例子

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <apr_general.h>
  5. #include <apr_pools.h>
  6. #define MEM_ALLOC_SIZE            1024
  7. /**
  8. * memory pool sample code
  9. * @remark Error checks omitted
  10. */
  11. int main(int argc, const char *argv[])
  12. {
  13. apr_status_t rv;
  14. apr_pool_t *mp;
  15. char *buf1;
  16. char *buf2;
  17. /* per-process initialization */
  18. rv = apr_initialize();
  19. if (rv != APR_SUCCESS) {
  20. assert(0);
  21. return -1;
  22. }
  23. /* create a memory pool. */
  24. apr_pool_create(&mp, NULL);
  25. /* allocate memory chunks from the memory pool */
  26. buf1 = apr_palloc(mp, MEM_ALLOC_SIZE);
  27. buf2 = apr_palloc(mp, MEM_ALLOC_SIZE);
  28. /* destroy the memory pool. These chunks above are freed by this */
  29. apr_pool_destroy(mp);
  30. apr_terminate();
  31. return 0;
  32. }

上面例子中的,要注意的是rv=apr_initialize()和apr_terminate(),这两个方法相当于初始化APR内部数据结构和结束APR库的使用,apr_initialize()函数必须是第一个被调用的APR库函数。

三,关于apr_pool_clear函数

这个函数和apr_pool_destory函数类似,但它在调用之后,内存池仍然可以使用。

  1. apr_pool_t *mp;
  2. apr_pool_create(&mp, NULL);
  3. for (i = 0; i < n; ++i) {
  4. do_operation(..., mp);
  5. apr_pool_clear(mp);
  6. }
  7. apr_pool_destroy(mp);

四,apr_pool_cleanup_register

一般的从池中分配的内存之后,当内存池被释放时,这块内存也会被自动的回收,也可以调用apr_pool_cleanup_register以显式的指定一个回调函数,当指定的内存被释放时。

如:

  1. int *value=(int*)malloc(sizeof(int));
  2. apr_pool_cleanup_register(pool,value,free,apr_pool_cleanup_null);

在这个注册之后,我们不用关心内存是否被释放以及什么时候释放的。当apr_pool_destory(pool)释放内存池时,上面的value指向的内存就会被自动的释放,并且调用free来释放。

Apache模块开发指南-APR池的更多相关文章

  1. Apache模块开发

    一.简介 Apache HTTP服务器是一个模块化的软件,使管理者可以选择核心中包含的模块以裁剪功能.可以在编译时选择被静态包含进httpd二进制映象的模块,也可以编译成独立于主httpd二进制映象的 ...

  2. Apache PDFbox开发指南之PDF文档读取

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51542309 相关文章: <Apache PDFbox开发指南之PDF文本内容 ...

  3. ECMALL模板解析机制.MVC架构分析及文件目录说明.二次开发指南手册(转)

    ECMALL模板解析语法与机制 http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php ECMALL模块开发 ...

  4. 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)

    原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...

  5. C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇)

    C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇) 名词解释:apxs apxs is a tool for building and installi ...

  6. C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)

    C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇) 名词解释:apxs apxs is a tool for building and installing ext ...

  7. 《Apache HttpClient 4.3开发指南》

    转载自:http://blog.csdn.net/chszs/article/details/16854747 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chs ...

  8. 移动IM开发指南3:如何优化登录模块

    <移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问 ...

  9. 开源项目SMSS开发指南(二)——基于libevent的线程池

    libevent是一套轻量级的网络库,基于事件驱动开发.能够实现多线程的多路复用和注册事件响应.本文将介绍libevent的基本功能以及如何利用libevent开发一个线程池. 一. 使用指南 监听服 ...

随机推荐

  1. 数据库部署到linux服务器,供本地访问。

    1.  将本地的sql文件上传至服务器 scp /Users/fangke/Documents/article.sql root@IP:/usr/local 2. 登陆服务器的mysql 3. 创建数 ...

  2. zookeeper集群安装及使用详解

    1. Zookeeper简介 ZooKeeper是一个开源的分布式框架,提供了协调分布式应用的基本服务.它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronizatio ...

  3. day03_12/13/2016_bean的管理之初始化和销毁

  4. java环境搭建(及安装问题“No repository found containing”解决) 并创立第一个java程序

    环境: java8 及 Eclipse java8 配置:http://jingyan.baidu.com/article/e2284b2b5967e7e2e7118d74.html Eclipse ...

  5. aop 切面demo

    /** * 必须要@Aspect 和 @Component一起使用否则没法拦截通知 * 搞了好久才明白刚刚开始以为时execution里面的配置的问题 * AOP使用很简单的 */@Aspect@Co ...

  6. ios数据的基本类型和流程控制

    swift的声明变量方式和js是类似的.基本类型基本都和java的差不多,多了字符类型. let:用于声明常量: var:用于声明变量: 基本类型有:double,float,Int(数字类型):bo ...

  7. viewpager无线轮播获取网络图片

    首先创建小圆点 小圆点的两个属性一共两个属性另一个跟这个一个样,只不过颜色能让我们区分的 <?xml version="1.0" encoding="utf-8&q ...

  8. maven——项目构建和依赖管理工具

    apache maven是一个用于项目构建和依赖管理的工具. 添加archetype https://repo1.maven.org/maven2/archetype-catalog.xml 更改本地 ...

  9. git使用原理

    如果需要新建仓库: mkdir new_artcle//artcle为文件名 cd new_artcle//进入该目录 git init //初始化工作空间 git add 文件名(article) ...

  10. CSS动画:旋转卡片效果

    <!DOCTYPE html> <html> <head> <title>demo</title> </head> <bo ...