问题1:
mxArray *data = mxCreateUninitNumericMatrix(1, 10, mxDOUBLE_CLASS, mxREAL);
mxSetN(data, 0);
mxDestroyArray(data);
mxDestroyArray会释放10个元素还是0个元素?
问题2:
mxArray *data = mxCreateUninitNumericMatrix(1, 10, mxDOUBLE_CLASS, mxREAL);
double *ptr = mxGetPr(data);
ptr = static_cast<double*>(mxRealloc(ptr, sizeof(double) * 20));
mxSetPr(data, ptr);
mxDestroyArray(data);
mxDestroyArray会释放10个元素还是20个元素?
谢谢,
答案 0 :(得分:2)
关于Q1:将释放至少10个元素。 Say docs for mxSetN
:
您通常使用
mxSetN
来更改现有mxArray
的形状。mxSetN
函数不会为pr
,pi
,ir
或jc
分配或取消分配任何空间 阵列。因此,如果您对mxSetN
和mxSetM
的调用增加了元素数量 在mxArray
中,放大pr
,pi
,ir
和/或jc
数组。
关于Q2:
在docs for mxDestroyArray
中,它具体说明了
mxDestroyArray
释放指定mxArray
占用的内存,包括:
mxArray
的特征字段,例如尺寸(m和n)和类型。- 关联数据阵列,例如
pr
和pi
用于复杂数组,ir
和jc
用于稀疏数组。
因此它将释放为sizeof(double) * 20
分配的所有ptr
个字节。
答案 1 :(得分:1)
@zeeMonkeez是对的,我只是想稍微扩展答案。
换句话说,在任何一种情况下都没有内存泄漏。
无论标头中存储的大小(M和N)如何,当数组被销毁时,将其视为free
堆分配的内存,它只知道数据的大小。
如果您已将创建的数组返回到MATLAB(plhs[0] = data;
)而不是销毁它们,结果是您浪费了空间,因为您告诉MATLAB数组的大小小于实际上是为数据分配的(第一种情况下为0而不是10,而第二种情况下为10而不是20)。但是,当阵列被销毁时,内存不会泄漏。只要矩阵在MATLAB的范围内,就会保留额外的内存,但是你无法访问它,只有在清除/销毁变量时才会回收它。