作为一个图形处理库,opencv的内部需要大量的内存空间,如何高效的使用这些内存空间十分重要。本文通过阅读../module/core/alloc.cpp源文件(opencv 2.4.4版本),来一探opencv中的内存管理方式。需要说明的是,上述源文件中包含了两种管理方式,而opencv目前只使用了其中一种最简单的方式,本文只对这种简单的方式进行了讨论(这就是题目中之一的原因)。在以后将会讨论另一种管理方式,这将会在之二中进行。
1 函数的声明
纵观opencv内部,所有的内存空间都是通过自定义的函数cvAlloc()和cvFree()来完成的,这两个函数的声明如代码1所示:
代码1:
/* <malloc> wrapper. If there is no enough memory, the function (as well as other OpenCV functions that call cvAlloc) raises an error. */ CVAPI(void*) cvAlloc( size_t size ); /* <free> wrapper. Here and further all the memory releasing functions (that all call cvFree) take double pointer in order to to clear pointer to the data after releasing it. Passing pointer to NULL pointer is Ok: nothing happens in this case */ CVAPI(void) cvFree_( void* ptr ); #define cvFree(ptr) (cvFree_(*(ptr)), *(ptr)=0)
这两个函数的声明在../modules/core/include/opencv/core/core_c.h文件中。其中CVAPI是一个宏,将这两个函数进行了如下定义:
调用方式:__cdecl,
dll输出函数,
编译方式:c方式
通过代码1可以看出,cvFree