OpenCV动态内存存储

CvMemStorage

  其原型如下:

typedef struct CvMemStorage {
    
    
    struct CvMemBlock *bottom;   /* first allocated block                       */
    struct CvMemBlock *top;      /* the current memory block - top of the stack */
    struct CvMemStorage *parent; /* borrows new blocks from                     */
    int block_size;              /* block size                                  */
    int free_space;              /* free space in the top block (in bytes)      */
} CvMemStorage;

内存存储器是一个可用来存储诸如序列、轮廓、图形、子划分等动态增长数据结构的底层结构。它是由一系列以同等大小的内存块构成,呈列表型:bottom域指的是列首,top域指的是当前指向的块但未必是列尾。在bottomtop之间所有的块(包括bottom,不包括top)被完全占据了空间;在top和列尾之间所有的块(包括块尾,不包括top)则是空的;而top块本身则被占据了部分空间,free_space指的是top块剩余的空字节数。新分配的内存缓冲区(或显式地通过cvMemStorageAlloc函数分配,或隐式地通过cvSeqPushcvGraphAddEdge等高级函数分配)总是起始于当前块(即top块)的剩余那部分。如果剩余那部分能满足要求(足够分配的大小),分配后,free_space就减少了新分配的那部分内存大小,外加一些用来保存适当列型的附加大小。当top块的剩余空间无法满足被分配的块(缓冲区)大小时,top块的下一个存储块被置为当前块(新的top块),free_space被置为先前分配的整个块的大小。如果已经不存在空的存储块(即top块已是列尾),则必须再分配一个新的块(或从parent那继承,见cvCreateChildMemStorage)并将该块加到列尾上去。于是存储器(memory storage)就如同栈(Stack)那样,bottom指向栈底,(top, free_space)对指向栈顶。栈顶可通过cvSaveMemStoragePos保存,通过cvRestoreMemStoragePos恢复指向,通过cvClearStorage重置。

CvMemBlock

  其原型如下:

typedef struct CvMemBlock {
    
    
    struct CvMemBlock *prev;
    struct CvMemBlock *next;
} CvMemBlock;

CvMemBlock代表一个单独的内存存储块结构。内存存储块中的实际数据存储在header块之后(即存在一个头指针head指向的块header,该块不存储数据),于是内存块的第i个字节可以通过表达式((char *)(mem_block_ptr + 1))[i]获得。然而,通常没必要直接去获得存储结构的域。

CvMemStoragePos

  其原型如下:

typedef struct CvMemStoragePos {
    
    
    CvMemBlock *top;
    int free_space;
} CvMemStoragePos;

该结构保存栈顶的地址。栈顶可以通过cvSaveMemStoragePos保存,也可以通过cvRestoreMemStoragePos恢复。

cvCreateMemStorage

  其作用是创建内存块:

CvMemStorage *cvCreateMemStorage ( int block_size = 0 );

参数block_size是存储块的大小,它以字节表示。如果大小是0 byte,则将该块设置成默认值,当前默认大小为64k。函数cvCreateMemStorage创建一内存块,并返回指向块首的指针。起初存储块是空的,除了block_size外,头部(即header)的所有域值都为0

cvReleaseMemStorage

  其作用是释放内存块:

void cvReleaseMemStorage ( CvMemStorage **storage );

参数storage指向被释放了的存储块的指针。函数cvReleaseMemStorage释放所有的存储(内存)块或者将它们返回给各自的parent(如果需要的话)。接下来再释放header块(即释放头指针head指向的块free(head)),并清除指向该块的指针(即head = NULL)。在释放作为parent的块之前,先清除各自的child块。

cvClearMemStorage

  其作用是清空内存存储块:

void cvClearMemStorage ( CvMemStorage *storage );

参数storage是存储存储块。函数cvClearMemStorage将存储块的top置到存储块的头部(清空存储块中的存储内容)。该函数并不释放内存,仅清空内存。假使该内存块有一个父内存块(即存在一内存块与其有父子关系),则函数就将所有的块返回给其parent

cvMemStorageAlloc

  其作用是在存储块中分配以内存缓冲区:

void *cvMemStorageAlloc ( CvMemStorage *storage, size_t size );

参数storage是内存块,size是缓冲区的大小。函数cvMemStorageAlloc在存储块中分配一内存缓冲区。该缓冲区的大小不能超过内存块的大小,否则就会导致运行时错误。缓冲区的地址被调整为CV_STRUCT_ALIGN字节(当前为sizeof(double))。

cvMemStorageAllocString

  其作用是在存储块中分配一文本字符串:

typedef struct CvString {
    
    
    int len;
    char *ptr;
} CvString;

CvString cvMemStorageAllocString (
    CvMemStorage *storage,
    const char *ptr, int len = -1 );
  • storage:存储块。
  • ptr:字符串。
  • len:字符串的长度(不计算\0)。如果参数为负数,函数就计算该字符串的长度。

函数cvMemStorageAlloString在存储块中创建了一字符串的拷贝。它返回一个结构,该结构包含字符串的长度(该长度或通过用户传递,或通过计算得到)和指向被拷贝了的字符串的指针。

cvSaveMemStoragePos

  其作用是保存内存块的位置(地址):

void cvSaveMemStoragePos ( const CvMemStorage *storage, CvMemStoragePos *pos );

参数storage是内存块,pos是内存块顶部位置。函数cvSaveMemStoragePos将存储块的当前位置保存到参数pos中。函数cvRestoreMemStoragePos可进一步获取该位置(地址)。

cvRestoreMemStoragePos

  其作用是恢复内存存储块的位置:

void cvRestoreMemStoragePos ( CvMemStorage *storage, CvMemStoragePos *pos );

参数storage是内存块,pos是新的存储块的位置。函数cvRestoreMemStoragePos通过参数pos恢复内存块的位置。该函数和函数cvClearMemStorage是释放被占用内存块的唯一方法。注意,没有什么方法可以去释放存储块中被占用的部分内存。

Guess you like

Origin blog.csdn.net/fukangwei_lite/article/details/121760282