如何释放临时字符串的内存?

时间:2011-11-27 16:42:05

标签: c string memory-leaks struct memory-management

我正在玩我的自定义字符串库,顺便说一下这很糟糕,但我是为了体验而做的。

无论如何,我有一些函数为String*分配一块内存来使用,它运行正常。调用string_delete(string*)函数时,将释放所有使用的内存。 但是我提出了一种将char*表示为String*的新方式,但我担心我为它保留的记忆并没有被释放。这是功能:

String* String_ToN(char* dest) {
  String* temp = calloc(1, sizeof (struct String));
  temp->length = strlen(dest);
  temp->buffer = (char*) malloc(temp->length + 1);
  strncpy(temp->buffer, dest, temp->length);
  return temp;
}

我不喜欢使用strdup因为它不是标准c所以我会坚持使用mallocstrncpy

这是有效的,我使用它是这样的:

String_GetLength(String*)接受String*参数,因此如果我在调用它时放入一个字符串文字,我会收到错误。

所以我转而去String_GetLength(String_ToN("hello")),它会像我预期的那样返回5。

但是String_ToN再次使用callocmalloc,我如何释放这段记忆并仍能使用ToN

3 个答案:

答案 0 :(得分:2)

与C ++不同,C中没有自动资源管理(因为没有析构函数)。你必须做类似的事情:

String *hello = String_ToN("hello");
int len = String_GetLength(hello);
String_free(hello);

其中String_free执行所有必要的清理。

答案 1 :(得分:1)

您需要一个功能来删除或释放String - s,也许

void String_delete(String *s) {
  if (!s) return;
  free (s->buffer);
  // you might want memset(s, 0, sizeof(*s)); to catch more bugs
  free (s);
}

您可能希望在free之前将内存归零(如在注释代码中)。它可能有助于捕捉悬挂指针错误。但是你可以使用像valgrind这样的工具来捕获它们。或者,使用Boehm's garbage collector非常有用:您可以使用GC_malloc代替malloc(等等),也不用打扰free或{{1} }。根据经验你会发现释放内存成为大型编程项目中的一个主要问题(不,RAII成语不是银弹。)

答案 2 :(得分:0)

正如Oli Charlesworth指出的那样,你必须创造出温和的对象。但是,您也可以添加标志

int dispose;

到你的String结构,然后在传递给某个函数时设置它。然后,获取String的每个函数都必须检查此标志,如果设置,则释放String结构。代码可能如下所示:

Process_String(String_ToN("Hello", 1));

然后

Process_String(String *str) {
    /* do smth with str */
    if(str->dispose)
        String_Delete(srt);
}

我同意这种设计更容易出错,而不是事情如何正常完成。因此,将其视为教育范例,不多也不少。