修复内存泄漏

时间:2012-11-09 18:16:50

标签: c memory pointers

我有以下函数在我的代码中被多次调用:

char* get_section_name(const char* section, const char* value) {

  char *tmp = (char *)malloc(STR_LEN * sizeof(char));

  if(strlen(section)>0) {

      strcat(tmp, section);

      strcat(tmp,".");

  }

  strcat(tmp, value);    

  return tmp;

}

我在其他函数中调用它:

section_name = get_section_name(data->model_name,"params_default");

释放这段记忆的最佳方法是什么?我可以在完成后拨打free(section_name)吗?

5 个答案:

答案 0 :(得分:1)

首先,您必须确保tmp实际已分配(即malloc未失败):

tmp = (char *)malloc(STR_LEN * sizeof(char));
if (tmp == NULL) {
  // quit now !
}

然后,当你strcat时,你必须确保tmp是一个空字符串,即它的第一个字符是0

tmp[0] = '\0';

然后,是的,您可以按照编写它的方式释放它。

最后一件事:你必须确定strlen(section)+strlen(".")+strlen(value) < STR_LEN,否则你将覆盖你不应该的记忆。

答案 1 :(得分:1)

free在这里会很棒,但作为替代方案,可能最好的方法是改变签名。如果你喜欢

void get_section_name(const char* section, const char* value, char * result)

然后你可以传递一个指向已分配内存的指针,因此这个函数的用户完全知道在使用它之后应该如何处理内存。

答案 2 :(得分:1)

free,但是,您可以考虑使用另一个名称来表明它正在分配内存。此外,您可以使用sprintf组合2个字符串,strdup只复制一个字符串。

char* create_section_name(const char* section, const char* value) { 
  const int sectionLen = strlen(section);   

  if(sectionLen>0) {
      //+1 for the period and +1 for the null
      char *tmp = (char *)malloc((sectionLen + strlen(value) + 2) * sizeof(char));
      //do that often? consider a newString(size) macro. See below
      sprintf(tmp, "%s.%s", section, value);    
      return tmp;
  }
  else {    
    return strdup(value);
  }
}

这假设您不需要完整的STR_LEN,它在两种情况下都使用得足够。

我建议

newString宏:

#define newString(size) (malloc((size) * sizeof(char)))

或者它甚至可以自动为null添加一个:

#define newString(size) (malloc(((size)+1) * sizeof(char)))

然后将malloc替换为:

char *tmp = newString(sectionLen + strlen(value) + 1); //+1 for period

答案 3 :(得分:0)

使用malloc()calloc()realloc()

创建内存时始终执行错误检查

是的,您可以在此使用free

free(section_name),因为返回的tmp存储在section_name中,现在指向malloced内存。

答案 4 :(得分:0)

我将实现STR_LEN足够大的信念的飞跃。如果是这样,那么free(section_name);就足够了。 Bur使用strcpy代替strcat或初始化空字符串。