我相信C#都有,但是C#中的不安全指针是程序员的责任。
EITD :: 各位,我想问一下理论上是否可以对当前的C++指针进行垃圾回收?
当然可以啊?从垃圾收集器的角度来看,指针算术与数组索引没有什么区别。像异或双向链表这样的东西会搞乱GC,但那不是指针算术,而且还有未定义的行为。此外,Boehm存在,这是一种适用于C ++的垃圾收集器的经验证据。在一段时间内,他们甚至威胁要将GC作为C ++ 0x的可选部分。
C++指针算术允许您构造N+1个指向T[N]的指针,&T[0]...&T[N-1]和一个哨兵&T[N-1]+1。它们都是指向T[N]数组对象的指针。在这个意义上,它们类似于其他“内部”指针,比如&foo.bar(对象成员的地址)。
其他指针算术是未定义行为,一个明显的UB例子可能是GC的意外删除数组。
是的,可以独立于类型安全实现垃圾回收机制(GC),这在 C++ 中并不是很普遍;但 GC 可用的优化机会将受到语言允许的类型灵活度的限制。
如果愿意接受运行时检查指针操作,从而重新实现语言已放弃的类型安全,则 GC 可以更为积极。目前,带有垃圾回收功能的 C++ 通常仅限于像Boehm-Demers-Weiser GC 这样的保守型垃圾回收器。
我不是GC实现方面的专家,但如果允许使用指针算术运算,那么就无法确定内存中的某个地址是否不再被引用。
举个例子
int *crazy_pointer;
srand ( time(NULL) );
while(true) {
crazy_pointer = (int *) rand() % MAX_SIZE_OF_MEMORY:
printf("$d",*crazy_pointer);
}
我已经以一种非常基本的方式使用指针算术来打印内存中随机位置的内容。这意味着机器上的所有内存基本上都是可访问的。如果它是可访问的,那么它就不能被GC回收。
是的,以上内容可能会在现代操作系统上导致崩溃,但这段代码是完全合法的C / C ++。如果允许指针算术,那么您无法实现可以防止此类滥用的GC :)