C - 释放指向指针的指针



在我的代码中,我分配了许多需要释放的二维数组。然而,每次我认为我已经掌握了指针的概念时,他们总是让我感到惊讶,因为他们没有做我期望他们;)

那么谁能告诉我如何处理这种情况?

这是我为指针分配内存的方式:

typedef struct HRTF_ {
  kiss_fft_cpx freqDataL[NFREQ]
  kiss_fft_cpx freqDataR[NFREQ]
  int nrSamples;
  char* fname;
} HRTF;
HRTF **_pHRTFs = NUL;
int _nHRTFs = 512;
_pHRTFs = (HRTF**) malloc( sizeof(HRTF*) *_nHRTFs );
int i = _nHRTFs;
while( i > 0 )
  _pHRTFs[--i] = (HRTF*) malloc( sizeof( HRTF ) );
// Load data into HRTF struct

以下是我认为应该释放已用内存的方式:

if( _pHRTFs != NULL )
{
  __DEBUG( "Free mem used for HRTFs" );
  for( i = 0; i < _nHRTFs; ++i )
  {
    if( _pHRTFs[i] != NULL )
    {
      char buf[64];
      sprintf( buf, "Freeing mem for HRTF #%d", i );
      __DEBUG( buf );
      free( _pHRTFs[i] );
    }
  }
  __DEBUG( "Free array containing HRTFs" );
  free( _pHRTFs );
}

释放单个_pHRTFs[i]的作品,打印了最后的__DEBUG语句,但最后free( _pHRTFs )给了我一个分割错误。为什么?

没关系 - 在最后一个free( _pHRTFs )后添加调试语句表明此代码实际上有效,而我的问题出在其他地方。谢谢你的时间!

乔纳斯

代码没问题。我试过运行它,它工作正常。下面是我测试的代码(我已经用 int 替换了未知数据类型)和我得到的输出,表明这里没有任何问题。您遇到的错误是因为其他原因。

#include <stdio.h>
#include <stdlib.h>
typedef struct HRTF_ {
      int freqDataL[10];
      int freqDataR[10];
      int nrSamples;
      char* fname;
} HRTF;
HRTF **_pHRTFs = NULL;
int _nHRTFs = 512;
int main(){
    printf("allocatingin");
    _pHRTFs = (HRTF**) malloc( sizeof(HRTF*) *_nHRTFs );
    int i = _nHRTFs;
    while( i > 0 )
          _pHRTFs[--i] = (HRTF*) malloc( sizeof( HRTF ) );
    printf("Allocation complete. Now deallocatingn");
    for( i = 0; i < _nHRTFs; ++i )
    {
        if( _pHRTFs[i] != NULL )
        {
            char buf[64];
            sprintf( buf, "Freeing mem for HRTF #%d", i );
            //__DEBUG( buf );
            free( _pHRTFs[i] );
        }
    }
    printf("complete without errorn");
    return 0;
}

并输出:

adnan@adnan-ubuntu-vm:desktop$ ./a.out 
allocatingi
Allocation complete. Now deallocating
complete without error
<</div> div class="one_answers">

内存分配和取消分配似乎很好。在将类型更改为 int 后,我也编译了上面的代码,并得到了以下输出。问题出在别的地方。

Freeing mem for HRTF #0
Freeing mem for HRTF #1
......
Freeing mem for HRTF #509
Freeing mem for HRTF #510
Freeing mem for HRTF #511

相关内容

  • 没有找到相关文章

最新更新