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__;
}
调用该函数时,其首先为结构体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__;
}
相关文章推荐
- OpenCV基础知识——动态结构(二)
- OpenCV2基础知识——Mat结构
- C语言复习之结构体基础知识
- C 语言与动态库相关基础知识
- 学习Spring必学的Java基础知识(2)----动态代理
- WinCE基础知识(二):WinCE 5.0 的目录结构
- Theano2.1.4-基础知识之图结构
- http报文结构/接口自动化基础知识
- 【oracle-基础知识】oracle体系结构
- 程序编译后的结构和动态编译重定位,程序编译知识
- 再探Linux动态链接 -- 关于动态库的基础知识
- C#基础知识整理:C#类和结构(2)
- opencv基础知识-videowriter
- php基础知识:控制结构
- 整理Java基础知识--循环结构
- Java 基础知识No.2——申请动态数组
- learn opencv- 深度学习使用Keras - 基础知识
- 数据结构基础知识之结构体
- 基于JVM的动态语言Groovy 基础知识汇总
- Mysql 基础知识点单表结构 第四更