C 库中释放分配的内存

问题描述 投票:0回答:1

我正在学习 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;
}

目前我看到两个选择:

  • 在文档中明确这是动态分配,因此用户必须自行释放内存。
  • 跟踪指针并编写一个清理函数。然后告诉用户这个清理函数必须在程序结束时调用。

第一个解决方案似乎更容易,但释放内存的责任交给了用户。我不知道对于这种情况是否还有其他选择以及最好的选择是什么。 对此你有何看法?

c dynamic-memory-allocation
1个回答
0
投票

在文档中明确这是动态分配,因此 用户必须自行释放内存。

是的,通常都是这样做的。

跟踪指针并编写一个清理函数。然后告诉 用户必须在结束时调用此清洁功能 程序。

在这种情况下,我认为没有必要为

free()
编写包装器。在
struct
包含具有动态内存分配的多个成员的情况下,内存释放函数的包装可能更相关,这使得将释放逻辑封装在单个函数中非常有用。

不过,在这种情况下,我确实建议将

size
data
组合成一个
struct
,并返回指向它的指针,然后提供一个清理函数来释放
data
字段。

© www.soinside.com 2019 - 2024. All rights reserved.