您的位置:首页 > 运维架构

OpenCV基础知识——动态结构(一)

2008-08-05 14:28 357 查看
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__;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: