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 函数不为prpiirjc 分配或释放任何空间 数组。因此,如果您对 mxSetNmxSetM 的调用增加了元素的数量 在mxArray 中,放大prpiir 和/或jc 数组。

关于第二季度: 在docs for mxDestroyArray 中明确表示

mxDestroyArray释放指定mxArray占用的内存包括:

mxArray 的特征字段,例如大小(m 和 n)和类型。 关联数据数组,例如用于复杂数组的prpi,以及用于稀疏数组的irjc

因此它将释放为ptr分配的所有sizeof(double) * 20字节。

【讨论】:

【参考方案2】:

@zeeMonkeez 是正确的,我只是想扩大一下答案。

    所有 10 个元素都被释放 所有 20 个元素都被释放

换句话说,在这两种情况下都没有内存泄漏。

无论header中存储的大小(M和N)如何,当数组被销毁时,将其视为free'ing堆分配的内存,它只知道数据的大小。

如果您将创建的数组返回给 MATLAB (plhs[0] = data;) 而不是销毁它们,结果是您浪费了空间,因为您会告诉 MATLAB 数组的大小小于实际分配给的大小数据(在第一种情况下是 0 而不是 10,在第二种情况下是 10 而不是 20)。但是,当数组被销毁时,内存不会泄漏。只要矩阵在 MATLAB 的范围内,就会保留额外的内存,但您无法访问它,只有在变量被清除/销毁时才会回收它。

【讨论】:

以上是关于mxDestroyArray 会正确释放重新分配的矩阵或更改大小的矩阵吗?的主要内容,如果未能解决你的问题,请参考以下文章

问题重新分配分配的对象

我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?

Swift,SpriteKit:释放游戏场景并重新分配新场景

类对象的动态分配以及释放

释放对象的校验和不正确 - 分配问题

结构中的数组和结构的 Malloc