cvCreateMemStorage函数
来源:互联网 发布:js div显示隐藏 编辑:程序博客网 时间:2024/04/30 15:08
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__;
}
- cvCreateMemStorage函数
- cvCreateMemStorage函数
- cvCreateMemStorage函数
- cvCreateMemStorage、cvCreateSeq
- CvMemStorage *storage=cvCreateMemStorage()
- cvCreateMemStorage//cvCreateSeq/…
- CvMemStorage *storage=cvCreateMemStorage(0);
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 调试打断点无效解决方法
- CAPropertyAnimation additive
- 一个简单的auth perl程序
- Eclipse中如何查看andriod apk真机运行的日志
- Scala 表达式编程实践
- cvCreateMemStorage函数
- 如何成为羽毛球高手?你距离一个真正的羽毛球高手还有多远?
- iOS开发的22个奇谲巧技
- android.os.Build的一些使用方法
- CADisplayLink以及和NSTimer的区别
- 图像配准
- CvCreateImage函数说明
- IP,子网掩码,默认网关
- 汇编语言学习笔记 第二节:数据传送指令