mxDestroyArray 会正确释放重新分配的矩阵或更改大小的矩阵吗?
Posted
技术标签:
【中文标题】mxDestroyArray 会正确释放重新分配的矩阵或更改大小的矩阵吗?【英文标题】:Will mxDestroyArray free reallocated matrix or matrix with changed size correctly? 【发布时间】:2016-03-16 03:02:21 【问题描述】:问题一:
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 个元素?
谢谢,
【问题讨论】:
请发布mxCreateUninitNumericMatrix()
、mxRealloc()
、msDestroyArray()
的实际代码,以防它破坏了分配的内存指针mxSetPr()
和mxSetN()
的代码。否则,我们怎么知道代码在做什么呢?
都是 Matlab 现有的 API。
【参考方案1】:
关于 Q1:至少 10 个元素将被释放。 Say docs for mxSetN
:
您通常使用
mxSetN
来更改现有mxArray
的形状。mxSetN
函数不为pr
、pi
、ir
或jc
分配或释放任何空间 数组。因此,如果您对mxSetN
和mxSetM
的调用增加了元素的数量 在mxArray
中,放大pr
、pi
、ir
和/或jc
数组。
关于第二季度:
在docs for mxDestroyArray
中明确表示
mxDestroyArray
释放指定mxArray
占用的内存包括:mxArray
的特征字段,例如大小(m 和 n)和类型。 关联数据数组,例如用于复杂数组的pr
和pi
,以及用于稀疏数组的ir
和jc
。
因此它将释放为ptr
分配的所有sizeof(double) * 20
字节。
【讨论】:
【参考方案2】:@zeeMonkeez 是正确的,我只是想扩大一下答案。
-
所有 10 个元素都被释放
所有 20 个元素都被释放
换句话说,在这两种情况下都没有内存泄漏。
无论header中存储的大小(M和N)如何,当数组被销毁时,将其视为free
'ing堆分配的内存,它只知道数据的大小。
如果您将创建的数组返回给 MATLAB (plhs[0] = data;
) 而不是销毁它们,结果是您浪费了空间,因为您会告诉 MATLAB 数组的大小小于实际分配给的大小数据(在第一种情况下是 0 而不是 10,在第二种情况下是 10 而不是 20)。但是,当数组被销毁时,内存不会泄漏。只要矩阵在 MATLAB 的范围内,就会保留额外的内存,但您无法访问它,只有在变量被清除/销毁时才会回收它。
【讨论】:
以上是关于mxDestroyArray 会正确释放重新分配的矩阵或更改大小的矩阵吗?的主要内容,如果未能解决你的问题,请参考以下文章
我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?