无法弄清楚如何释放我的结构

时间:2017-05-01 19:50:10

标签: c memory struct malloc free

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

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

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

我真的很感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

一般情况下,当且仅当指针已通过define service { host_name localhost service_description Current Load use local-service check_command check_local_load!0.5,0.5,0.5!0.5,0.5,0.5 register 1 } 分配时,您应free()指针。要做到这一点,你必须确保不要松散"任何指向malloc() ed内存地址的指针,例如通过将malloc多次分配给同一个变量而不复制它之前的值或没有释放先前分配的内存。

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

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的部分成员始终使用freeNULL ed值进行初始化,以防止您的代码&#34;释放&#34;垃圾指针值。

答案 1 :(得分:0)

重置&#39; keysnvalue&#39;使用下一个&#39; malloc()&#39;,你覆盖指向前一个值&nbsp;&nbsp;&#39; keysnvalue&#39;的指针。这使得相关存储无法访问,即内存泄漏问题。 [除非您保留“键值”的前一个值的副本&#39;在另一个地方]。如果你真的用新的结构替换结构,你必须免费()&#39;先是旧的,然后是&#39; malloc()&#39;下一个 - 你不能等到最后清理一切。

就我个人而言,我不会这样做 - 对于一个新的结构,我会称之为“memset()&#39;将现有结构归零。