読者です 読者をやめる 読者になる 読者になる

kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

メモリプールを使ってみる

APR(Apache Portable Runtime)のメモリプール機能を使ってみました。メモリプールを利用して、メモリを確保する流れは次のようになるようです。

  1. apr_pool_create関数を使用して、メモリプールを作成します。
  2. apr_pallocまたはapr_pcalloc関数を使用して、メモリプールからメモリを確保します。
  3. 確保したメモリを使用します。
  4. apr_pool_clearまたはapr_pool_destroy関数を使用して、メモリプールを破棄します。

上記でメモリの解放という手順は存在しません。APRではメモリプールの単位でメモリを管理していて、メモリ解放は適宜実施してくれるようです。

上記では、メモリプールを1つしか作らない流れですが、メモリプールは複数作成する事が可能で、各メモリプールは、親子関係を付ける事が出来ます。

プログラム例

親子関係のメモリプールを作成し、メモリ確保し、確保したメモリに文字列を書き込むプログラムを作成してみました。

try_apr_pools.c

/*
 * APRのメモリプール機能を使ってみました。
 */
#include <stdio.h>
#include "apr_pools.h"

int main(int argc, char **argv) {
	
	apr_status_t status = APR_SUCCESS;
	apr_pool_t *pool = NULL;
	apr_pool_t *pool2 = NULL;
	void *ptr = NULL;
	
	// APRを初期化する。
	apr_initialize();
	
	// 親プールを作成する。
	status = apr_pool_create(&pool, NULL);
	if (status == APR_SUCCESS) {
		
		// メモリを確保する。
		ptr = apr_pcalloc(pool, 10);
		
		// 子供プールを作成する。
		status = apr_pool_create(&pool2, pool);
		if (status == APR_SUCCESS) {
			
			// メモリを確保する。
			ptr = apr_pcalloc(pool2, 10);
			if (ptr != NULL) {
				// 書き込み
				strcpy((char*)ptr, "Hello");
				
				printf("書き込み結果 [%s]\n", ptr);
			}
			
			// メモリを解放する。
			apr_pool_clear(pool2);
		}
		else {
			printf("子供プールを作成できませんでした。\n");
		}
		
		// プールを破棄する。
		apr_pool_destroy(pool);
	}
	else {
		printf("親プールを作成できませんでした。\n");
	}
	
	// APRを終了する。
	apr_terminate();
	
	return 0;
}

実行結果

$ ./try_apr_pools.exe
書き込み結果 [Hello]

補足

参考サイト

Memory Pool Functions
http://apr.apache.org/docs/apr/1.2/group__apr__pools.html

動作環境

OS : Windows XP, Cygwin
APR Version : 1.2.12