我在一个需要使用malloc()和free()的替代类似工作的环境中工作。我想调用FFTW,但如果FFTW内部调用malloc()和free()用于它自己的目的,它将搞砸我所在的内存管理环境,所以我需要一种方法告诉FFTW使用我提供的替代功能而不是malloc和free。我怎么做?
答案 0 :(得分:1)
我当然希望您的基础mex编译器是gcc / GNU binutils。如果没有,您可能想要更改mex编译器。这个答案非常具体到GNU ld ......
将以下内容添加到使用mexFunction编译的代码中:
void *
__wrap_malloc(size_t size)
{
return mxMalloc(size);
}
void
__wrap_free(void *ptr)
{
return mxFree(ptr);
}
void *
__wrap_memalign(size_t alignment __attribute__((__unused__)), size_t size)
{
return mxMalloc(size);
}
BTW,我通过执行objdump -T libfftw3.so并查找堆管理函数的*UND*
条目来获取要包装的三个函数的列表。这是出现的唯一三个。
现在,将以下内容添加到mex命令行:
CLIBS='-Wl,--wrap=malloc,--wrap=free,--wrap=memalign,-Bstatic,-lfftw3,-Bdynamic $CLIBS'
通过强制链接器静态引入libfftw3,它可以使用自定义包装器包装指定的堆调用,该包装器重定向到MATLAB的堆管理功能。
如果你想要花哨,你可以在memalign()包装器中手动强制执行对齐,并返回一个正确对齐的指针,但是你必须跟踪每个分配以免费撤消指针更改( ) 时间。我只是天真地假设MATLAB的分配器将返回已经为零的指针,最大有用对齐,认为MATLAB的需要类似于FFTW。
另外,请记住在mexFunction的出路上销毁所有计划和fftw_cleanup()。在你的mexFunction返回时,MATLAB将强制释放你的mexFunction(或你的mexFunction调用的FFTW),除非你明确mexMakeMemoryPersistent()它。