是否可以为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的自定义内存池了!
答案 0 :(得分:1)
直接来自文档
使用
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);
这是库提供用户回调的标准方法。