cvCreateMemStorage函数

来源:互联网 发布:js div显示隐藏 编辑:程序博客网 时间:2024/04/30 15:08

cvCreateMemStorage函数:

     调用该函数时,其首先为结构体CvMemStorage分配了空间,紧接着调用了函数 icvInitMemStorage对该空间进行了初始化。

    源码如下:

  1. CV_IMPL CvMemStorage*
  2. cvCreateMemStorage( int block_size )
  3. {
  4.     CvMemStorage *storage = 0;

  5.     CV_FUNCNAME( "cvCreateMemStorage" );

  6.     __BEGIN__;

  7.     CV_CALL( storage = (CvMemStorage *)cvAlloc( sizeof( CvMemStorage )));
  8.     CV_CALL( icvInitMemStorage( storage, block_size ));

  9.     __END__;

  10.     if( cvGetErrStatus() < 0 )
  11.         cvFree( &storage );

  12.     return storage;
  13. }

(2) icvInitMemStorage函数分析:

        首先将待分配的空间大小调节成8字节的倍数,然后将传入的CvMemStorage结构体中的字段都置为零,接着初始化其内存块区域的大小。

 源码如下所示:

  1. static void
  2. icvInitMemStorage( CvMemStorage* storage, int block_size )
  3. {
  4.     CV_FUNCNAME( "icvInitMemStorage " );
  5.     
  6.     __BEGIN__;

  7.     if( !storage )
  8.         CV_ERROR( CV_StsNullPtr, "" );

  9.     if( block_size <= 0 )
  10.         block_size = CV_STORAGE_BLOCK_SIZE;

  11.     block_size = cvAlign( block_size, CV_STRUCT_ALIGN );
  12.     assert( sizeof(CvMemBlock) % CV_STRUCT_ALIGN == 0 );

  13.     memset( storage, 0, sizeof( *storage ));
  14.     storage->signature = CV_STORAGE_MAGIC_VAL;
  15.     storage->block_size = block_size;

  16.     __END__;
  17. }

(3)cvCreateChildMemStorage函数的功能:

     其中调用了cvCreateMemStorage函数,然后将传入的parent参数,初始化给新分配的结构体的parent字段。

源码如下:

  1. CV_IMPL CvMemStorage *
  2. cvCreateChildMemStorage( CvMemStorage * parent )
  3. {
  4.     CvMemStorage *storage = 0;
  5.     CV_FUNCNAME( "cvCreateChildMemStorage" );

  6.     __BEGIN__;

  7.     if( !parent )
  8.         CV_ERROR( CV_StsNullPtr, "" );

  9.     CV_CALL( storage = cvCreateMemStorage(parent->block_size));
  10.     storage->parent = parent;

  11.     __END__;

  12.     if( cvGetErrStatus() < 0 )
  13.         cvFree( &storage );

  14.     return storage;
  15. }




  16. (4)cvReleaseMemStorage
  17. 在该函数执行过程中,其调用了icvDestroyMemStorage
  18. 源码如下:
    1. CV_IMPL void
    2. cvReleaseMemStorage( CvMemStorage** storage )
    3. {
    4.     CvMemStorage *st;
    5.     CV_FUNCNAME( "cvReleaseMemStorage" );

    6.     __BEGIN__;

    7.     if( !storage )
    8.         CV_ERROR( CV_StsNullPtr, "" );

    9.     st = *storage;
    10.     *storage = 0;

    11.     if( st )
    12.     {
    13.         CV_CALL( icvDestroyMemStorage( st ));
    14.         cvFree( &st );
    15.     }

    16.     __END__;
    17. }

    (5)icvDestroyMemStorage

  19. 该函数首先判断该Strorage有没有父节点,如果有,就将本Strorage对应的block块依次添加到其父节点所对应的Block链表末端;如果没有,就将其他的Block块依次释放。

  20. 代码:

  21. static void
    icvDestroyMemStorage( CvMemStorage* storage )
    {
        CV_FUNCNAME( "icvDestroyMemStorage" );

  22.     __BEGIN__;

  23.     int k = 0;

  24.     CvMemBlock *block;
        CvMemBlock *dst_top = 0;

  25.     if( !storage )
            CV_ERROR( CV_StsNullPtr, "" );

  26.     if( storage->parent )
            dst_top = storage->parent->top;

  27.     for( block = storage->bottom; block != 0; k++ )
        {
            CvMemBlock *temp = block;

  28.         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 );
            }
        }

  29.     storage->top = storage->bottom = 0;
        storage->free_space = 0;

  30.     __END__;
    }


0 0
原创粉丝点击