Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 会导致内存泄漏吗?_C - Fatal编程技术网

C 会导致内存泄漏吗?

C 会导致内存泄漏吗?,c,C,考虑到这个伪代码序列: variable x malloc(x); free(x); malloc(x); free(x) //..so on 执行malloc时,自由序列会导致内存泄漏吗?需要改用realloc吗?否,这不会导致内存泄漏。realloc用于立即重新分配,而不是先使用free。执行几个freemallocn;不会导致内存泄漏。 但是它可能会使内存碎片化。如果在一个长时间运行的进程中以随机顺序进行无数次分配和释放,可能会发生什么呢。实际上,它可能只会在运行几天的进程中发生 如果

考虑到这个伪代码序列:

variable x

malloc(x);
free(x);
malloc(x);
free(x)
//..so on

执行malloc时,自由序列会导致内存泄漏吗?需要改用realloc吗?

否,这不会导致内存泄漏。realloc用于立即重新分配,而不是先使用free。

执行几个freemallocn;不会导致内存泄漏。 但是它可能会使内存碎片化。

如果在一个长时间运行的进程中以随机顺序进行无数次分配和释放,可能会发生什么呢。实际上,它可能只会在运行几天的进程中发生

如果在任何其他分配之前malloc一个区域并释放同一个区域,则碎片发生的可能性较小。以某种随机顺序进行分配和解除分配时,这种情况更可能发生

如果您的应用程序正在malloc不同大小的区域,那么就没有什么可以做的了;您可能会使用一些压缩算法或受其启发的其他方法,请阅读。您还可以考虑,例如,将应用程序设计为能够写入和重新加载磁盘上的所有空间。然后,在几个小时的工作之后,您将检查磁盘上的状态,并从该状态重新启动应用程序

顺便说一句,对于长时间运行的应用程序,您希望出于其他原因检查点,例如,避免因断电而损失数天的计算时间

您可能会考虑在检查点和重启之间升级应用程序。这很棘手。读来读去

您还可以使用一些更高级的语言实现:并具有压缩垃圾收集器,因此当您使用这些语言编写代码时,碎片发生的可能性要小得多。Ocaml有内置的,SBCL可以使用

在Linux上,是调试malloc相关bug的有用工具

PS.:如果你考虑编写一个长期运行的程序,你应该在设计阶段仔细考虑。例如,嵌入解释器通常是值得的。

您错误地使用了malloc。你应该这样做

char *data=malloc(24 * sizeof(char)); // or anything instead of 24

分配完空间后,您可以释放空间,然后再次分配空间。它不会造成任何泄漏

不,尽管你尊重每一个malloc都应该有自己的自由。但是,你提供的代码是可疑的

variable x

malloc(x);
free(x);
malloc(x);
free(x)
//..so on
应该是:

variable x

x=malloc(n);
free(x);

x=malloc(n);
free(x)

//..so on

等等,你没有用malloc的结果?人们。。。我使用的是伪代码。。只是为了说明这个想法,我不明白为什么你不循环它,运行一夜,看看发生了什么。你在考虑什么样的应用程序?他根本不使用realloc,也从不保存malloc的结果。此外,他还使用存储在x中的垃圾数据。它可能会在启用编译器警告的情况下崩溃一次。这将是一个编译错误。这就是我说启用编译器警告的原因。@ForceBru gcc说sizeofvoid无效@米凯卡特,真的吗?我不知道,我要编辑我的答案。我用伪代码来说明这个想法。但是谢谢你的提醒@这很有帮助。谢谢。