无法弄清楚如何释放我的结构
Cannot figure out how to free my structure
我需要释放()为我的结构配置分配的所有内存。
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()' 重置 'keysnvalue' 时,您 覆盖 指向 'keysnvalue' 的先前值的指针。这使得关联的存储无法访问,即 'memory leak' [除非您在另一个位置维护 'keysnvalue' 的先前值的副本]。如果你真的要用新的结构替换结构,你必须先 'free()' 旧的,然后 'malloc()' 下一个 - 你不能等到最后才清理所有东西。
我个人不会那样做 - 对于新结构,我会调用 'memset()' 将现有结构清零。
通常,当且仅当它已通过 malloc()
分配时,您应该 free()
一个指针。为此,您必须确保不 "loose" 任何指向 malloc
ed 内存地址的指针,例如通过将 malloc
多次分配给同一个变量而没有复制它的先前值或没有释放先前分配的内存。
我没有分析你提到的完整代码。
但似乎您在 malloc
为 sect[i].keysnvalues
设置新值之前将 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 值进行初始化,以防止您来自 "freeing" 垃圾指针值的代码。
我需要释放()为我的结构配置分配的所有内存。
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()' 重置 'keysnvalue' 时,您 覆盖 指向 'keysnvalue' 的先前值的指针。这使得关联的存储无法访问,即 'memory leak' [除非您在另一个位置维护 'keysnvalue' 的先前值的副本]。如果你真的要用新的结构替换结构,你必须先 'free()' 旧的,然后 'malloc()' 下一个 - 你不能等到最后才清理所有东西。
我个人不会那样做 - 对于新结构,我会调用 'memset()' 将现有结构清零。
通常,当且仅当它已通过 malloc()
分配时,您应该 free()
一个指针。为此,您必须确保不 "loose" 任何指向 malloc
ed 内存地址的指针,例如通过将 malloc
多次分配给同一个变量而没有复制它的先前值或没有释放先前分配的内存。
我没有分析你提到的完整代码。
但似乎您在 malloc
为 sect[i].keysnvalues
设置新值之前将 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 值进行初始化,以防止您来自 "freeing" 垃圾指针值的代码。