文章目录
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
域指的是当前指向的块但未必是列尾。在bottom
和top
之间所有的块(包括bottom
,不包括top
)被完全占据了空间;在top
和列尾之间所有的块(包括块尾,不包括top
)则是空的;而top
块本身则被占据了部分空间,free_space
指的是top
块剩余的空字节数。新分配的内存缓冲区(或显式地通过cvMemStorageAlloc
函数分配,或隐式地通过cvSeqPush
、cvGraphAddEdge
等高级函数分配)总是起始于当前块(即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
是释放被占用内存块的唯一方法。注意,没有什么方法可以去释放存储块中被占用的部分内存。