z_stream의 zalloc, afree, opaque 속성은 사용자 메모리 제어 함수를 지정할 때 사용합니다. 3속성을 모두 Z_NULL로 입력하고 초기화 함수(deflateInit 또는 inflateInit)를 호출하면, zlib는 기본 메모리 제어 함수를 사용하게 됩니다.
zlib 소스에서는 함수 포인터를 다음과 같이 선언하고 있습니다.
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void (*free_func) OF((voidpf opaque, voidpf address));
//
#include "stdafx.h"
#include <Libz/zlib.h>
#include <iostream>
voidpf my_fn(voidpf opaque, uInt items, uInt size);//
void my_free(voidpf opaque, voidpf address);
int _tmain(int argc, _TCHAR* argv[])
{
do{
const char* mop = "my opaque";
z_stream stream;
stream.zalloc = my_fn;
stream.zfree = my_free;
stream.opaque =(voidpf) mop;
std::cout<<"deflateInit"<<std::endl;
int ret = deflateInit(&stream, Z_DEFAULT_COMPRESSION);
if( Z_OK != ret) break;
std::cout<<"deflateEnd"<<std::endl;
deflateEnd(&stream);
} while(false);
system("pause");
return 0;
}
voidpf
my_fn (voidpf opaque, uInt items, uInt size){
std::cout<<"my_fn"<<std::endl;
std::cout<<"opaque:"<< (const char*) opaque<<std::endl;
std::cout<<"items:"<< items<<", size:"<<size<<std::endl;
return calloc(items, size);
}
void
my_free(voidpf opaque, voidpf address){
std::cout<<"my_free"<<std::endl;
std::cout<<"opaque:"<< (const char*) opaque<<std::endl;
std::cout<<"address:"<<address<<std::endl;
free(address);
}