【发布时间】:2013-01-05 10:31:16
【问题描述】:
C++11 允许其实现执行(某些)垃圾收集实用程序。为什么标准会允许这样做?我一直认为,在 C++ 中,不用为不用的东西付费。对我来说,(隐式)GC 感觉就像它破坏了这种意识形态。此外,通过智能指针在 C++ 中编写和使用显式垃圾收集实用程序并不难。
其次,GC 会使一些原本有效的程序失效。示例包括指针屏蔽和相关的低级指针“hacks”。
int * nums = new int[10];
nums += 2;
*nums = 777; // nothing points to the new'ed int[10] at this point
// oh no! nums could have gotten collected!!! (so lets assume it was)
*nums = 666; // crash (or memory corruption (or something else that's bad))
【问题讨论】:
-
如果垃圾收集器可以选择释放用于
Foo对象的内存,这并不意味着它必须首先调用Foo的析构函数。 -
@hvd:对。我已经更新了我的问题
-
@JamesMcNellis 存储为整数的指针值的异或列表以前完全有效。
-
@hvd 好吧,整数和指针之间的转换是依赖于实现的,但是如果实现是这样的,xor 技巧会产生预期的值,那么在 C 中使用该值作为指针是有效的++03。现在使用具有严格指针安全性的 C++11 实现,您必须使用
std::declare_reachable()才能使此类代码有效。在安全性宽松的实现中,该技巧仍然有效。
标签: c++ c++11 garbage-collection