4

私のコードでは、解放する必要がある多数の 2 次元配列を割り当てています。ただし、ポインタの概念を理解したと思うたびに、期待どおりに動作しないことに驚かされます;)

では、この状況に対処する方法を誰か教えてもらえますか?:

これは、ポインターにメモリを割り当てる方法です。

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 )と、このコードが実際に機能していて、私の問題が別の場所にあることがわかりました..お時間をいただきありがとうございます!

ジョナス

4

2 に答える 2

2

コードは大丈夫です。実行してみましたが、問題なく動作します。以下は、私がテストしたコード (未知のデータ型を 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("allocatingi\n");
    _pHRTFs = (HRTF**) malloc( sizeof(HRTF*) *_nHRTFs );

    int i = _nHRTFs;
    while( i > 0 )
          _pHRTFs[--i] = (HRTF*) malloc( sizeof( HRTF ) );

    printf("Allocation complete. Now deallocating\n");
    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 error\n");
    return 0;
}

そして出力:

adnan@adnan-ubuntu-vm:desktop$ ./a.out 
allocatingi
Allocation complete. Now deallocating
complete without error
于 2012-05-09T10:06:07.500 に答える
1

メモリの割り当てと割り当て解除は問題ないようです。タイプを 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
于 2012-05-09T10:17:35.780 に答える