7zAlloc.h声明了四个函数,用来申请和释放内存,其中输入参数ISzAllocPtr p的类型在头文件7zTypes.h中定义。
7zAlloc.c中实现了7zAlloc.h中声明的四个函数,该文件中还定义了全局变量g_allocCount和g_allocCountTemp,其实这两个全局变量只是方便调试(从打印的变量信息来观测程序是否正常),功能上没有实际意义。
void *SzAlloc(ISzAllocPtr p, size_t size)
{
UNUSED_VAR(p);
if (size == 0)
return 0;
#ifdef _SZ_ALLOC_DEBUG
fprintf(stderr, "\nAlloc %10u bytes; count = %10d", (unsigned)size, g_allocCount);
g_allocCount++;
#endif
return malloc(size);
}
void SzFree(ISzAllocPtr p, void *address)
{
UNUSED_VAR(p);
#ifdef _SZ_ALLOC_DEBUG
if (address != 0)
{
g_allocCount--;
fprintf(stderr, "\nFree; count = %10d", g_allocCount);
}
#endif
free(address);
}
void *SzAllocTemp(ISzAllocPtr p, size_t size)
{
UNUSED_VAR(p);
if (size == 0)
return 0;
#ifdef _SZ_ALLOC_DEBUG
fprintf(stderr, "\nAlloc_temp %10u bytes; count = %10d", (unsigned)size, g_allocCountTemp);
g_allocCountTemp++;
#ifdef _WIN32
return HeapAlloc(GetProcessHeap(), 0, size);
#endif
#endif
return malloc(size);
}
void SzFreeTemp(ISzAllocPtr p, void *address)
{
UNUSED_VAR(p);
#ifdef _SZ_ALLOC_DEBUG
if (address != 0)
{
g_allocCountTemp--;
fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp);
}
#ifdef _WIN32
HeapFree(GetProcessHeap(), 0, address);
return;
#endif
#endif
free(address);
}
上述函数是对malloc函数和free函数,HeapAlloc函数和HeapFree函数的封装,都是为了申请和释放内存,关于两者有何区别,可以参考内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc。
本文介绍了7-Zip中用于内存管理的四个封装函数:SzAlloc、SzFree、SzAllocTemp和SzFreeTemp。这些函数分别对应于标准C库中的malloc和free函数,以及Windows平台上的HeapAlloc和HeapFree函数,并提供了调试信息的支持。
1239

被折叠的 条评论
为什么被折叠?



