使用的是C语言中的malloc函数, 在分配的时候多申请了CV_MALLOC_ALIGN*((size >= 4096) + 1) + sizeof(char*)
大小的空间. 多申请空间的用处暂时先不分析.
下面的cvAlignPtr函数用于将指针对其到CV_MALLOC_ALIGN边界, 对于我们常规的PC来说是32bit, 也就是4字节.
cvAlignPtr函数在后面会详细讨论.
下面语句将ptr0记录到(ptr - sizeof(char*)), 可以把它看作一个指针. 最后返回ptr.
细心的朋友可能会发现, 前面malloc分配的是ptr0, 现在返回的却是ptr, 这个是为什么呢?
这个的原因还是先放下(我也不懂), 但是返回ptr而不返回ptr0带来的影响至少有2个:
1. 返回的ptr指针不能通过C语言的free函数释放(这也是cvAlloc/cvFree必须配对使用的原因).
2. 在cvFree的时候, 可以根据(ptr - sizeof(char*))对应的值来检测该内存是不是由icvDefaultAlloc申请.
这样应该说可以增加程序的健壮性, icvDefaultFree可以不傻瓜似的对于任何指针都进行释放.
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#define CV_MALLOC_ALIGN 32
inline void* cvAlignPtr( const void* ptr, int align=32 )
{
assert( (align & (align-1)) == 0 );
return (void*)( ((size_t)ptr + align - 1) & ~(size_t)(align-1) );
}
static void*
alloc(int size) {
char *ptr, *ptr0 = (char*)malloc(
(size_t)(size + CV_MALLOC_ALIGN*((size >= 4096) + 1) + sizeof(char*)));
if( !ptr0 )
return 0;
// align the pointer
ptr = (char*)cvAlignPtr(ptr0 + sizeof(char*) + 1, CV_MALLOC_ALIGN);
*(char**)(ptr - sizeof(char*)) = ptr0;
printf("ptr %x \t ptr0 %x\n", ptr, ptr0);
return ptr;
}
static int
icvDefaultFree( void* ptr)
{
// Pointer must be aligned by CV_MALLOC_ALIGN
if( ((size_t)ptr & (CV_MALLOC_ALIGN-1)) != 0 )
return 3;
printf("ptr free %x\n", ptr);
printf("ptr-1 %x\n", *((char **)ptr-1));
free( *((char**)ptr - 1) );
return 0;
}
int main(int argc, char *argv[])
{
char *p = (char *)alloc(4097);
icvDefaultFree(p);
return 0;
}
0 评论: (+add yours?)
Post a Comment