OpenCV的自定义内存分配器

时间:2012-05-22 14:53:16

标签: memory-management opencv pool allocator

是否可以为OpenCV 2.3.1设置自定义分配器?我创建了一个内存池,我希望OpenCV能够根据需要使用该池。

这可能吗? 如果是,怎么办呢?

更新

自上次回答以来我做了一些进展,但我仍有一些问题。 这是我现在的代码:

CvAllocFunc allocCV() 
{ 
     return (CvAllocFunc) MEMPOOL->POOLalloc(sz); 
}

CvFreeFunc deallocCV()
{
    return (CvFreeFunc) MEMPOOL->POOLfree(ptr);
}

...

cvSetMemoryManager(allocCV(),deallocCV(),data);

现在,我的问题是,如何才能访问我想要分配的数据的大小和指针,然后再解除分配?

刚刚发现: 使用cvSetMemoryManager时,使用(2.3.1)的OpenCV I版本会引发错误。原因在于其源代码:

void cvSetMemoryManager( CvAllocFunc, CvFreeFunc, void * )
{
    CV_Error( -1, "Custom memory allocator is not supported" );
}

我对此非常失望。我想我不能再使用OpenCV的自定义内存池了!

1 个答案:

答案 0 :(得分:1)

直接来自文档

http://opencv.willowgarage.com/documentation/c/core_utility_and_system_functions_and_macros.html#setmemorymanager

使用

void cvSetMemoryManager(CvAllocFunc allocFunc=NULL, CvFreeFunc freeFunc=NULL, void* userdata=NULL)

功能

您的代码

cvSetMemoryManager(allocCV(),deallocCV(),data);

错了。

看看会发生什么:你调用 allocCV和deallocCV函数(它们会返回一些指针,它会被静默地转换为cvAllocFunc)!

这只是一个开始。请参阅alloc / dealloc语义的文档。您应该使用正确的签名编写allocCV / deallocCV。

void* CV_CDECL allocCV(size_t size, void* userdata)
{
     return ((YourMemPoolTypeWhichIDoNotKnow*)userdata)->POOLalloc(size);
}

int CV_CDECL deallocCV(void* pptr, void* userdata)
{
    return ((YourMemPoolTypeWhichIDoNotKnow*)userdata)->POOLfree(pptr);
}

然后在'userdata'参数中传递MEMPOOL:

cvSetMemoryManager(&allocCV, &deallocCV, (void*)MEMPOOL);

这是库提供用户回调的标准方法。