【发布时间】:2015-07-14 01:15:57
【问题描述】:
我编写了一个 C++ 接口 dll 来调用英特尔集成性能基元 (IPP) 库中的一些关键图像处理统计测量方法,以便我们可以利用 SIMD 功能。我能够使用 calllib 将两个 2D Matlab 数组传递给函数
A = single( rand(3,4) );
B = single( rand(3,2) );
pOut = calllib('IPPInterface', 'myFunc', A' , B' , size(A,1), size(A,2) , size(B,1), size(B,2) );
在 C++ 中,myFunc 具有以下签名,以及 body 的 sn-p...
float* myFunc( float A[] , float B[] , int nRowsA , int nColsA , int nRowsB , int nColsB )
{
...
float[] pDst = new float[nRowsA*nColsA];
...
return pDst;
}
我不确定的是 Matlab 如何以及是否成功从内存中删除此类缓冲区。它们最终以 lib.pointers 的形式出现在 Matlab 进程中:
>> class(pOut)
ans =
lib.pointer
我只是好奇我所做的是否是一个坏主意,或者调用 Matlab 的 clear pOut 是否会处理所有事情并避免可能的内存泄漏。
【问题讨论】:
-
值得注意的是,Matlab不能为你删除内存,因为有几十个native allocator,都是互不兼容的,而且你没有向Matlab表明是哪个一个正在使用中。
-
@BenVoigt 我不熟悉不兼容的本机分配器的概念,您是指跨操作系统平台还是在给定操作系统内?我知道不同的分配方式有不同的行为,比如 calloc、malloc、C++ new,但是如果我想到的例子完全符合这种不兼容的概念的话。
-
我说的是
mallocvsnewvsnew[]vsHeapAllocvsVirtualAllocvsSysAllocStringvsSafeArrayCreateVectorvsCoTaskMemAllocvs .NET 垃圾收集器.还有一个事实是,一个编译器提供的new与另一个编译器提供的不同(这就是操作系统提供HeapAlloc的原因——所以你可以独立于你的编译器),最重要的是,C++允许重载::operator new,因此它甚至不使用编译器提供的实现。 -
导出返回的指针甚至可能根本不是动态分配的——它可能是指向内存映射文件的指针,或者是 DLL 中具有静态生命周期的全局变量。或者它可能是一个指向更大动态分配中间的指针。最后,除非您以某种方式告诉它要使用哪个函数,否则 Matlab 无法正确解除分配。您所希望的最好结果是能够为 Matlab 指定一个释放函数,以便在 Matlab 对象被垃圾回收时调用。
-
@BenVoigt solid,这是我在整理我一直在研究的所有这些多语言内容时必须开始欣赏的那种想法。这些动态类型语言处理了很多细节,但我所做的确实是在 Matlab 之外的,它不可能知道如何处理发送的实体。我对 Matlab 的假设太多了,现在我知道并且可以在跨越其他语言障碍时提出类似的问题。非常感谢。
标签: c++ matlab dll loadlibrary dynamic-allocation