我需要释放()为我的结构配置分配的所有内存。
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].keysnvalues
malloc
新值之前将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
的节成员始终使用NULL
或malloc
ed 值进行初始化,以防止代码"释放"垃圾指针值。
当你用下一个'malloc()'重置'keysnvalue'时,你正在覆盖指向上一个值'keysnvalue'的指针。 这使得关联的存储无法访问,即"内存泄漏"[除非您在另一个位置维护先前值"keysnvalue"的副本]。 如果你真的要用一个新的结构替换结构,你必须首先"释放()"旧的结构,然后"malloc()"下一个 - 你不能等到最后清理所有东西。
就个人而言,我不会那样做 - 对于一个新的结构,我会调用"memset()"来清零现有结构。