我正在学习 C,我给自己一个项目来编写一个处理 .wav 文件的库。
我有这个函数,我可以在其中分配一个数组并将指针返回给用户。但我不知道在这种情况下释放内存的好做法是什么。
waveError waveReadSubchunk(FILE* file,uint8_t* id, uint8_t** data, uint32_t* size)
{
uint16_t eof;
uint32_t ckSize=0;
uint8_t actId[4];
*data = malloc(0);
fseek(file,0,SEEK_END);
eof = ftell(file);
fseek(file,12,SEEK_SET);
while(ftell(file)<eof && strncmp(id,actId,4)!=0){
fseek(file,ckSize,SEEK_CUR);
fread(actId,1,4,file);
fread(&ckSize,4,1,file);
}
if (ftell(file)>=eof){
return WAVE_INVALID_ID;
}
*data = realloc(*data,ckSize);
fread(*data,1,ckSize,file);
*size = ckSize;
return WAVE_NO_ERROR;
}
目前我看到两个选择:
第一个解决方案似乎更容易,但释放内存的责任交给了用户。我不知道对于这种情况是否还有其他选择以及最好的选择是什么。 对此你有何看法?
在文档中明确这是动态分配,因此 用户必须自行释放内存。
是的,通常都是这样做的。
跟踪指针并编写一个清理函数。然后告诉 用户必须在结束时调用此清洁功能 程序。
在这种情况下,我认为没有必要为
free()
编写包装器。在 struct
包含具有动态内存分配的多个成员的情况下,内存释放函数的包装可能更相关,这使得将释放逻辑封装在单个函数中非常有用。
不过,在这种情况下,我确实建议将
size
和 data
组合成一个 struct
,并返回指向它的指针,然后提供一个清理函数来释放 data
字段。