mxDestroyArray会正确地更改大小的自由重新分配的矩阵或矩阵吗?

时间:2016-03-16 03:02:21

标签: c++ c matlab mex

问题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个元素?

谢谢,

2 个答案:

答案 0 :(得分:2)

关于Q1:将释放至少10个元素。 Say docs for mxSetN:

  

您通常使用mxSetN来更改现有mxArray的形状。 mxSetN   函数不会为prpiirjc分配或取消分配任何空间   阵列。因此,如果您对mxSetNmxSetM的调用增加了元素数量   在mxArray中,放大prpiir和/或jc数组。

关于Q2: 在docs for mxDestroyArray中,它具体说明了

  

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

     
      
  • mxArray的特征字段,例如尺寸(m和n)和类型。
  •   
  • 关联数据阵列,例如prpi用于复杂数组,irjc用于稀疏数组。
  •   

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

答案 1 :(得分:1)

@zeeMonkeez是对的,我只是想稍微扩展答案。

  1. 释放所有10个元素
  2. 释放所有20个元素
  3. 换句话说,在任何一种情况下都没有内存泄漏。

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

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