【发布时间】:2010-12-29 21:26:48
【问题描述】:
有一个相关问题,但这个问题略有不同,我对相关问题的任何答案都不满意 :)
我将否定这个问题,断言不可能为 C++ 提供可选的透明垃圾收集器,并希望有人能证明我错了。是的,Stroustrup 对此进行了尝试,但多次失败不是因为技术问题,而是因为一致性问题。性能在这里不是问题。
C++ 永远不会有这样一个收集器的原因是,作为一个可选,没有收集器运行的程序必须手动实现所有必需的内存管理。添加收集器可能会提供一些性能优势,但尚不清楚它们是否值得(是的,收集器可以更快)。
您无法获得的是自动内存管理,这是需要收集器的主要原因。您将通过强制收集获得此信息(如果您选择进行正确的手动管理,则不必牺牲 RAII 或其他东西)。具有可选手动内存管理的强制收集器是可行的。
不幸的是,获得强制收集器的唯一方法与不使用收集器的早期版本的 C++ 不兼容:换句话说,如果我们想要自动透明的内存管理,我们必须定义一种新语言。
所以我的观点是:C++ 永远不会有垃圾收集,因为它被锁定在一个需要向上兼容的历史发展中:强制收集与可选的手动内存管理是可行的,但透明的可选垃圾收集是不可行的。
通过展示一个可靠的可选透明垃圾收集模型来证明我错了!
编辑:
Oooo .. 我想我有答案了。有人可以引用标准要求程序删除堆分配的对象吗?
因为:该子句(如果存在)是唯一阻止可选透明垃圾收集的事情。甚至可能有足够的时间从 C++1x 中删除该子句。
如果没有这样的子句,程序可能会泄漏内存而行为未定义:内存不足时的行为与通常情况相同。因此,添加垃圾收集器不会对指定的语义产生任何影响:它们是否定义明确,与是否使用收集器无关。
【问题讨论】:
-
我相信它叫C++/CLI ;-) 当然是在使用“句柄”时。
-
标准不需要相应地调用
deleteIIRC——尽管如果你不这样做,你的电脑会讨厌你。 -
@Billy:它不需要删除,你是对的。需要的是
new-ed 对象的释放必须使用delete。但是,当然,继续。如果您愿意,请泄漏。 :) -
真的吗?不需要销毁每个构造的对象吗?然后我们已经可以有可选的集合了。故意泄漏的程序可以解决小问题,而需要收集器来解决更大的问题。
-
不调用对象的析构函数确实是未定义的。然而,标准并没有定义用户应该调用析构函数,而不是 GC,也没有定义应该发生这种情况的任何时间范围。未能删除新对象在 C++03 中未定义,但在 C++0x 中定义了实现。