在我的代码中,我分配了一些二维数组,需要释放它们。然而,每当我认为我已经掌握了指针的概念时,它们总是会让我感到惊讶,因为它们并不像我所期望的那样工作 ;)
那么,有人能告诉我如何处理这种情况吗?
这是我为我的指针分配内存的方式:
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 )
之后添加一个调试语句显示,这段代码实际上是有效的,我的问题在其他地方。感谢您的时间!
Jonas
_nHRTFs
的值相同(尽管有很多被认为是不好的形式:将malloc
的结果强制转换,不检查malloc
是否成功,使用sizeof(T)
而不是sizeof *var
,使用sprintf
而不是snprintf
,以前导下划线命名事物)。 - jamesdlin