免费动态分配内存

3
int i;
char *s = (char*)malloc(sizeof(char)*10);
for(i = 0; i <= 4; ++i)
    s[i] = 'a';
s[5] = '\0';
printf("%s\n", s);
free(s).

上述代码会有内存泄漏问题吗?函数“free”如何知道需要释放多少内存?

1
这里使用sizeof(char)是多余的。 - Seth Carnegie
1
或许有些多余,但仍是一个好的实践。 - Nik Bougalis
sizeof(char) 怎么可能是好的实践呢?它只是 1,非常简单。如果你想以后更改类型,使用 sizeof *s 会更好。 - Carl Norum
1
这是一个很好的观点。养成让你试图做什么变得非常清晰的习惯是很好的;我以前曾经被这种类型的代码咬过,当人们只是放置他们需要的实际字节数而不是显示他们实际上意味着分配nt类型的对象时。但你是对的,更好和更“防弹”的方法是使用sizeof(*s)而不是sizeof(some_type) - Nik Bougalis
3个回答

4
你的代码没有内存泄漏。至于你的第二个问题,当你调用 malloc 时,除了返回内存外,还会发生其他事情。C库保留一些空间来放置自己的头文件和簿记信息,以便在你调用 free 时可以正确处理。
关于你的代码的一些编辑注释:
  • C程序中不需要强制转换 malloc() 的返回值。在C中,void *malloc()返回的类型)与其他指针类型之间的转换是隐式的。

  • sizeof(char)1,为什么要写出来呢?

  • 你的循环写入了三个字符到 s 中,然后你的程序跳过了一个字符(s[4]),再添加 \0。这有点奇怪。你的循环里是否应该使用 i <= 4,或者在循环后使用 s[4] = '\0' 呢?

  • 在你的 free() 调用后,你使用了一个 . 而不是分号 ;。我想这只是这里的一个错别字,而不是你的程序中的错误,因为那样编译不过。


非常出色且非常详尽的回答。 - Nik Bougalis

2

它不会泄漏内存。该库知道要释放多少内存,因为它在内部跟踪每个块的分配大小。它具体的实现方式可能会在从一个malloc到另一个malloc之间甚至从一个版本到另一个版本发生变化,您不应该关心它。


如果你正在编写实现代码,那么你可能需要关注这个问题! - Carl Norum
这当然是真的 - 但是 如果 你是,你就不会在 StackOverflow 上问这种问题了 ;) - Nik Bougalis

0

不,你在结尾处使用了free s,并且没有使用多个s。我认为你没问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接