c语言 - 无法弄清楚如何释放我的结构



我需要释放()为我的结构配置分配的所有内存。

struct keysnvalues {
char* key;
char* value;
};
struct section {
char *name;
struct keysnvalues *keysnvalues;
int keysnvalues_ammount;
};
struct config {
struct section *sections;
int section_ammount;
};

在代码的开头,我这样做

struct section * sect = malloc(sizeof(struct section) * 255);
struct keysnvalues * keysnvalue = malloc(sizeof(struct keysnvalues) * 255);

如果我想添加部分,我会为第一个添加该部分

sect[++num_section].name = buffer; // buffer is the name

在接下来的部分中

sect[num_section].keysnvalues = keysnvalue;
sect[num_section].keysnvalues_ammount = num_keysnvalues;
cfg -> section_ammount++;
//start with new keysnvalue
num_keysnvalues = 0;
keysnvalue = malloc(sizeof(struct keysnvalues) * 255);
sect[++num_section].name = buffer;
sect[num_section].keysnvalues = 0;

如果我想向我正在使用的部分添加一个键和一个值,我会这样做

keysnvalue[num_keysnvalues].key = key;
keysnvalue[num_keysnvalues++].value = value;

整个代码在这里: https://pastebin.com/pGztJ9k4

我知道这可能是一个愚蠢的问题,但是我现在无法弄清楚如何释放整个结构配置数小时。

我真的很感激你的帮助。

通常,当且仅当指针已通过malloc()分配时,才应free()指针。为此,您必须确保不要"松散"任何指向malloc内存地址的指针,例如,将malloc多次分配给同一变量,而无需复制其先前的值或未释放先前分配的内存。

我没有分析你提到的完整代码。 但似乎您在为sect[i].keysnvaluesmalloc新值之前将keysnvalue的值复制到当前部分。 因此,似乎每个部分都有自己的keysnvalue,您可以循环播放:

for (int i=0;i< num_section;i++) {
if (sect[i].keysnvalues != NULL) {
free(sect[i].keysnvalues);
// free(sect[i].name);  // if buffer has also been malloced
}
}
free (keysnvalue);
free (sect);

可能您还必须循环每个sect[i].keysnvalue才能最终释放key/value

确保要在程序结束时free的节成员始终使用NULLmalloced 值进行初始化,以防止代码"释放"垃圾指针值。

当你用下一个'malloc()'重置'keysnvalue'时,你正在覆盖指向上一个值'keysnvalue'的指针。 这使得关联的存储无法访问,即"内存泄漏"[除非您在另一个位置维护先前值"keysnvalue"的副本]。 如果你真的要用一个新的结构替换结构,你必须首先"释放()"旧的结构,然后"malloc()"下一个 - 你不能等到最后清理所有东西。

就个人而言,我不会那样做 - 对于一个新的结构,我会调用"memset()"来清零现有结构。

相关内容

  • 没有找到相关文章

最新更新