首页 > 解决方案 > 为什么 C 在 malloc 中没有内置的保守垃圾收集

问题描述

我们知道,内存泄漏是编写 C 程序时最常见/最严重的问题之一。我知道通过调用释放内存是程序员的责任free(),但是将保守的垃圾收集器集成到 malloc 包中仍然是可行的。

在此处输入图像描述

当然,这个垃圾收集器是保守的,因为 C 不使用类型信息标记内存位置(与 Java 的成熟垃圾收集器不同),C 中的收集器无法推断数据实际上是 int eg 而不是指针. 因此,分配器必须保守地将一个块标记为可达,而实际上它可能不是。但没关系,它仍然可以正常工作,只是无法释放所有无法访问的块,总比没有好。

那么为什么 C 没有内置的保守垃圾收集malloc来减轻程序员的负担呢?

标签: cheap-memory

解决方案


C 是一种旨在尽可能高效地执行的语言。它用于许多对性能敏感的环境,例如内核、嵌入式和实时系统。

因此,尽管在 C 中添加一个虚拟垃圾收集器是可能的(并且在技术上非常简单),但这会降低 C 的性能,因为它需要存储额外的数据来管理这个 GC(例如参见 Java 的 GC)。请注意,由于 Jérôme Richard 指出的指针算术,不可能制作完全通用的 C GC。内存块永远不会被指向并且仍然有效(由于间接访问,XOR-ing,...)

此外,C中的内存管理并不复杂,有经验的 C 程序员很少犯这样的错误(双重释放、内存丢失、读取未初始化的内存……)。还需要注意的是,有很多工具可以调试 C 程序,例如valgrind可以轻松检查内存访问的正确性。

总之,如果您需要 GC 等高级功能,C 语言不适合您。C 允许非常高性能的计算,但它的学习曲线非常陡峭,并且注重性能而不是用户舒适度


推荐阅读