在我的代码中,我分配了一些我需要释放的二维数组。然而,每当我认为我已经掌握了指针的概念时,他们就会因为没有按照我的期望去做而让我感到惊讶;)
那么有谁能告诉我如何处理这种情况?:
这就是我为指针分配内存的方法:
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 )
之后添加调试语句表明此代码实际上正在运行,而我的问题就在其他地方..感谢您的时间!
纳斯
答案 0 :(得分: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
答案 1 :(得分: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