如何正确使用C++;Matlab中的动态链接库 我编写了一个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有以下签名,以及体的片段… float* myFunc( float A[] , float B[] , int nRowsA , int nColsA , int nRowsB , int nColsB ) { ... float[] pDst = new float[nRowsA*nColsA]; ... return pDst; }

如何正确使用C++;Matlab中的动态链接库 我编写了一个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有以下签名,以及体的片段… float* myFunc( float A[] , float B[] , int nRowsA , int nColsA , int nRowsB , int nColsB ) { ... float[] pDst = new float[nRowsA*nColsA]; ... return pDst; },c++,matlab,dll,loadlibrary,dynamic-allocation,C++,Matlab,Dll,Loadlibrary,Dynamic Allocation,我不确定的是Matlab如何以及是否成功地从内存中删除了这些缓冲区。它们最终以lib.pointer的形式出现在Matlab过程中: >> class(pOut) ans = lib.pointer 我只是好奇我所做的是不是一个坏主意,或者调用Matlab的clear pOut可以解决所有问题并避免可能的内存泄漏。所以我一直在通过在Matlab中创建两个数组来进行内存测试,如下所示 I = single( rand( 1200 , 1600 ) ); T = single( r

我不确定的是Matlab如何以及是否成功地从内存中删除了这些缓冲区。它们最终以lib.pointer的形式出现在Matlab过程中:

>> class(pOut)

ans =

lib.pointer

我只是好奇我所做的是不是一个坏主意,或者调用Matlab的
clear pOut
可以解决所有问题并避免可能的内存泄漏。

所以我一直在通过在Matlab中创建两个数组来进行内存测试,如下所示

I = single( rand( 1200 , 1600 ) );
T = single( rand( 100  , 100  ) );
然后,我将我的函数放入一个循环中,将内存使用情况打印到一个文本文件中,并清除返回的libpointer

for i = 1:10000
    lp = calllib('IPPInterface', 'myFunc', I , T , size(I,2) , size(I,1) , size(T,2) , size(T,1) );
    clear lp;

    [u,s] = memory;

    fprintf( fileID ,'%13g    %13s\n' ,  u.MemUsedMATLAB , s.SystemMemory.Available );
end 
正如你们在下面看到的,走这条路肯定会填满我的物理内存,并且让我相信我所做的是一个坏主意,Matlab不会以某种自动垃圾收集的方式为你们处理这个问题

>> memory
Maximum possible array:              38799 MB (4.068e+010 bytes) *
Memory available for all arrays:     38799 MB (4.068e+010 bytes) *
Memory used by MATLAB:               21393 MB (2.243e+010 bytes)
Physical Memory (RAM):               34814 MB (3.650e+010 bytes)

*  Limited by System Memory (physical + swap file) available.
>> clear all
>> memory
Maximum possible array:              38803 MB (4.069e+010 bytes) *
Memory available for all arrays:     38803 MB (4.069e+010 bytes) *
Memory used by MATLAB:               21388 MB (2.243e+010 bytes)
Physical Memory (RAM):               34814 MB (3.650e+010 bytes)

*  Limited by System Memory (physical + swap file) available.
>> 

如果我关闭Matlab,操作系统自然会回收所有内存

在浏览了Matlab的网站之后,我确实找到了一个非常接近的例子,该例子在共享库中动态分配了一个c结构,后来Matlab不得不调用同一个库中编写的函数,该库的唯一任务就是删除该结构

在实现了对共享库的一个简单接口调用以取消分配我的数组并在完成后使用它之后,这个示例就开始了

void deallocateArray( float* A )
{
    delete[] A;
}
内存配置文件是扁平的,整个10000次迭代完成得更快

for i = 1:10000
    lp = calllib('IPPInterface', 'myFunc', I , T , size(I,2) , size(I,1) , size(T,2) , size(T,1) );
    calllib('IPPInterface', 'deallocateArray', lp );
    clear lp;

    [u,s] = memory;

    fprintf( fileID ,'%13g    %13s\n' ,  u.MemUsedMATLAB , s.SystemMemory.Available );
end 

值得注意的是,Matlab无法为您删除内存,因为有几十个本机分配器,它们都是互不兼容的,您没有向Matlab指出使用的是哪一个。@BenVoigt我不熟悉不兼容本机分配器的概念,您是指跨操作系统平台还是在给定的操作系统中?我知道不同的分配方式有不同的行为,比如CaloC,Maloc,C++新的,但是这个不相容的概念在哪里适合于这个图片,如果我想的例子是:<代码> Malc VS <代码>新< /COD> VS <代码>新[]vs
HeapAlloc
vs
VirtualAlloc
vs
SysAllocString
vs
SafeArrayCreateVector
vs
CoTaskMemAlloc
vs.NET垃圾收集器。还有一个事实,一个编译器提供的
new
与另一个编译器提供的不一样(这就是为什么操作系统提供了
HeapAlloc
——因此您可以独立于编译器),除此之外,C++允许重载<代码>::运算符new < /Cord>,甚至它不使用编译器提供的实现。并且导出的指针可能根本不动态分配——它可以是指向内存映射文件的指针,或者是具有静态生存期的DLL中的全局变量。或者,它可能是指向更大动态分配中间的指针。最后,Matlab不可能正确地解除分配,除非您以某种方式告诉它要使用哪个函数。您所能期望的最好的功能就是能够为Matlab指定一个释放函数,以便在Matlab对象被垃圾收集时调用。@BenVoigt solid,在编写我所研究的所有多语言内容时,我必须开始欣赏这种想法。这些动态类型语言处理了很多细节,但我所做的确实是从Matlab外部进行的,它不可能知道如何处理按其方式发送的实体。我对Matlab的假设太多了,现在我知道了,并且在跨越其他语言障碍时可以开始问类似的问题。非常感谢。