-6

我想知道我是否可以看到 C 或 C++ 中的垃圾收集器是如何工作的?

选择内存中未使用的值的算法是什么?

谁能告诉我 GC 在 C 中是如何工作的?

4

5 回答 5

5

C 和 C++ 没有垃圾收集。

于 2012-11-16T06:58:25.467 回答
4

两种语言都没有垃圾收集器。至少,不是作为标准兼容实现的一部分。

请注意,C++ 有语言限制,因此很难实现垃圾收集。最新标准 C++11 中放宽了其中一些规则。因此,原则上现在可以实现符合标准的 c++ 垃圾收集器。

C++ 中的标准方法是使用智能指针来自动管理内存。

这里有一篇有趣的文章,包含一些有用的链接。从评论中您可能会看到协调 GC 与惯用的 C++ 是多么困难。

于 2012-11-16T06:58:39.067 回答
3

请查看本文/文章:Hans Boehm的 C 和 C++ 垃圾收集器

于 2012-11-16T06:59:27.773 回答
2

尽管标准 C 和 C++ 中不支持垃圾收集,但至少有一种流行且非常便携的实现,称为Boehm-Demers-Weiser 保守垃圾收集器

保守的垃圾收集器通过假设所有看起来像指针的东西都是一个指针来工作,即使它实际上是一个整数。因此,它们有时可能无法回收未引用的对象。此外,诸如异或指针之类的技巧可以隐藏指针。但根据我的经验,它们在实践中似乎运作良好。

于 2012-11-16T07:04:04.567 回答
0

在 C 中,垃圾收集完全是手动的;您需要跟踪分配给malloc()或相关功能的任何内容,以便free()在完成后释放它,而这永远不会自动完成。

C++ 大体相同;你需要delete分配的任何东西new(以及delete[]分配的任何数组new[])。然而,这个过程可以(并且应该)通过创建管理动态资源的对象并在其析构函数中释放它们来部分自动化。这种技术通常被称为RAII,最常见的例子是标准库中的容器和智能指针。

两种语言都没有自动垃圾收集,也没有任何方法来确定是否正在使用任何动态对象;您总是需要自己管理动态资源。有一些非标准的扩展来提供垃圾收集,但我对它们一无所知。

于 2012-11-16T07:07:49.917 回答