cvCreateMemStorage函数:
调用该函数时,其首先为结构体CvMemStorage分配了空间,紧接着调用了函数 icvInitMemStorage对该空间进行了初始化。
源码如下:
- CV_IMPL CvMemStorage*
- cvCreateMemStorage( int block_size )
- {
- CvMemStorage *storage = 0;
-
- CV_FUNCNAME( "cvCreateMemStorage" );
-
- __BEGIN__;
-
- CV_CALL( storage = (CvMemStorage *)cvAlloc( sizeof( CvMemStorage )));
- CV_CALL( icvInitMemStorage( storage, block_size ));
-
- __END__;
-
- if( cvGetErrStatus() < 0 )
- cvFree( &storage );
-
- return storage;
- }
(2) icvInitMemStorage函数分析:
首先将待分配的空间大小调节成8字节的倍数,然后将传入的CvMemStorage结构体中的字段都置为零,接着初始化其内存块区域的大小。
源码如下所示:
- static void
- icvInitMemStorage( CvMemStorage* storage, int block_size )
- {
- CV_FUNCNAME( "icvInitMemStorage " );
- __BEGIN__;
-
- if( !storage )
- CV_ERROR( CV_StsNullPtr, "" );
-
- if( block_size <= 0 )
- block_size = CV_STORAGE_BLOCK_SIZE;
-
- block_size = cvAlign( block_size, CV_STRUCT_ALIGN );
- assert( sizeof(CvMemBlock) % CV_STRUCT_ALIGN == 0 );
-
- memset( storage, 0, sizeof( *storage ));
- storage->signature = CV_STORAGE_MAGIC_VAL;
- storage->block_size = block_size;
-
- __END__;
- }
(3)cvCreateChildMemStorage函数的功能:
其中调用了cvCreateMemStorage函数,然后将传入的parent参数,初始化给新分配的结构体的parent字段。
源码如下:
- CV_IMPL CvMemStorage *
- cvCreateChildMemStorage( CvMemStorage * parent )
- {
- CvMemStorage *storage = 0;
- CV_FUNCNAME( "cvCreateChildMemStorage" );
-
- __BEGIN__;
-
- if( !parent )
- CV_ERROR( CV_StsNullPtr, "" );
-
- CV_CALL( storage = cvCreateMemStorage(parent->block_size));
- storage->parent = parent;
-
- __END__;
-
- if( cvGetErrStatus() < 0 )
- cvFree( &storage );
-
- return storage;
- }
-
-
-
-
- (4)cvReleaseMemStorage
- 在该函数执行过程中,其调用了icvDestroyMemStorage
- 源码如下:
-
- CV_IMPL void
- cvReleaseMemStorage( CvMemStorage** storage )
- {
- CvMemStorage *st;
- CV_FUNCNAME( "cvReleaseMemStorage" );
-
- __BEGIN__;
-
- if( !storage )
- CV_ERROR( CV_StsNullPtr, "" );
-
- st = *storage;
- *storage = 0;
-
- if( st )
- {
- CV_CALL( icvDestroyMemStorage( st ));
- cvFree( &st );
- }
-
- __END__;
- }
-
(5)icvDestroyMemStorage
-
该函数首先判断该Strorage有没有父节点,如果有,就将本Strorage对应的block块依次添加到其父节点所对应的Block链表末端;如果没有,就将其他的Block块依次释放。
-
代码:
-
static void
icvDestroyMemStorage( CvMemStorage* storage )
{
CV_FUNCNAME( "icvDestroyMemStorage" ); -
__BEGIN__;
-
int k = 0;
-
CvMemBlock *block;
CvMemBlock *dst_top = 0; -
if( !storage )
CV_ERROR( CV_StsNullPtr, "" ); -
if( storage->parent )
dst_top = storage->parent->top; -
for( block = storage->bottom; block != 0; k++ )
{
CvMemBlock *temp = block; -
block = block->next;
if( storage->parent )
{
if( dst_top )
{
temp->prev = dst_top;
temp->next = dst_top->next;
if( temp->next )
temp->next->prev = temp;
dst_top = dst_top->next = temp;
}
else
{
dst_top = storage->parent->bottom = storage->parent->top = temp;
temp->prev = temp->next = 0;
storage->free_space = storage->block_size - sizeof( *temp );
}
}
else
{
cvFree( &temp );
}
} -
storage->top = storage->bottom = 0;
storage->free_space = 0; -
__END__;
}