2012-11-16 47 views
-6

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

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

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

+1

如果您使用自己的垃圾回收器,当然。如果你不这样做,那么答案是否定的,因为没有spoo - 我的意思是没有垃圾收集器。 – Cornstalks

+0

http://www.parashift.com/c++-faq-lite/garbage-collector-basics.html – Lundin

+0

看看http://stackoverflow.com/questions/24891/c-memory-management – UmNyobe

回答

4

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

请注意,C++有语言限制,这使得它很难实现垃圾回收。其中一些规则在最新的标准C++ 11中已经放宽了。所以原则上现在可以实现符合标准的C++垃圾收集器。

C++中的标准方法是使用smart pointers来自动管理内存。

有一个interesting article here,包含一些有用的链接。从评论中你可以看出,GC与习惯C++的协调是多么的困难。

+0

如果它没有不是为什么某些情况下会打印垃圾值? –

+0

@ l4zyw0rm我不确定你的意思,但总的来说,打印内容和收集内容的能力是断开的。 – juanchopanza

+0

比垃圾值呢?有时打印垃圾值,这些值来自哪里? –

5

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

3

请查看本文/文章:从汉斯·贝姆

+0

是的,我正在寻找这!谢谢 –

2

A garbage collector for C and C++虽然在标准C和C++没有垃圾收集的支持,至少有一个流行和漂亮的便携式实施称为Boehm-Demers-Weiser conservative garbage collector

保守的垃圾收集器通过假设所有看起来像指针的东西都是一个指针,即使它是例如现实中的整数。所以,他们有时可能无法回收未引用的对象。此外,一些像xoring指针这样的技巧可以隐藏指针。但根据我的经验,他们似乎在实践中工作得很好。

0

在C中,垃圾收集是完全手动的;您需要跟踪任何使用malloc()或相关功能分配的任何内容,因此您可以在完成后使用free()发布它,而且这绝不会自动完成。

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

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