【发布时间】:2016-01-03 03:27:25
【问题描述】:
我了解,如果您分配内存来临时存储某些内容,例如响应用户操作,当代码再次到达该点时,您不再需要内存,您应该释放内存所以它不会导致泄漏。如果不清楚,以下是我知道释放内存很重要的示例:
#include <stdio.h>
#include <stdlib.h>
void countToNumber(int n)
{
int *numbers = malloc(sizeof(int) * n);
int i;
for (i=0; i<n; i++) {
numbers[i] = i+1;
}
for (i=0; i<n; i++) {
// Yes, simply using "i+1" instead of "numbers[i]" in the printf would make the array unnecessary.
// But the point of the example is using malloc/free, so pretend it makes sense to use one here.
printf("%d ", numbers[i]);
}
putchar('\n');
free(numbers); // Freeing is absolutely necessary here; this function could be called any number of times.
}
int main(int argc, char *argv[])
{
puts("Enter a number to count to that number.");
puts("Entering zero or a negative number will quit the program.");
int n;
while (scanf("%d", &n), n > 0) {
countToNumber(n);
}
return 0;
}
但是,有时,我会在程序运行的整个过程中都需要该内存,即使我最终为同一目的分配了更多内存,存储在先前分配的内存中的数据仍会被使用。所以我最终需要释放内存的唯一一次是在程序退出之前。
但是如果我最终不释放内存,那真的会导致内存泄漏吗?我认为操作系统会在进程退出后立即回收内存。即使它不会导致内存泄漏,是否还有其他原因释放内存很重要,前提是这不是 C++ 并且不需要调用析构函数?
例如,下面的例子中是否需要free 调用?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
void *ptr = malloc(1024);
// do something with ptr
free(ptr);
return 0;
}
在那种情况下,free 并不是很不方便,但在我为包含指向 other 动态分配数据的指针的结构动态分配内存的情况下,最好知道我不需要设置循环来做到这一点。特别是如果结构中的指针指向具有相同结构的对象,我需要递归删除它们。
【问题讨论】:
-
是的,因为你的程序会随着时间的推移而改变,你会忘记这个 hack
-
正确的资源所有权规则是理解如何构建系统的一部分。您的问题也可能是“如果只是简单的事情,我真的需要了解我在做什么吗”。
-
主要问题是,在您编写了执行动态分配的代码之后,您应该立即编写清理代码。否则,在清理方式确实很重要的情况下,您最终会编写出内存泄漏的程序。
free()永远不会造成任何伤害。
标签: c pointers memory-management memory-leaks free