12

垃圾引用和悬空引用有什么区别?

4

3 回答 3

25

悬空引用是对不再存在的对象的引用。垃圾是无法通过引用访问的对象。

垃圾回收语言中不存在悬空引用,因为对象仅在不再可访问时才被回收(仅收集垃圾)。在某些语言或框架中,您可以使用“弱引用”,它可以悬空,因为在收集过程中不考虑它们。

在具有手动内存管理的语言(如 C 或 C++)中,您可能会遇到悬空指针,例如:

int * p = new int;
delete p;

int i = *p; // error, p has been deleted!
于 2011-05-05T15:19:21.993 回答
3

悬空引用是对不再存在的对象的引用。

什么被认为是垃圾取决于垃圾收集器的实现。

对于跟踪和引用计数 GC,不能存在悬空引用(除非存在 GC 实现错误),因为只有那些不存在引用的元素才被认为有资格进行垃圾回收。

因此,悬空引用几乎只对于具有手动内存管理的系统是一个问题。

于 2011-05-05T15:26:34.320 回答
0

悬空引用:对最初分配但现在已解除分配的内存地址的引用

int x= 1000;   //creates a new 
memory block
int* p = x;   // *p is the pointer to address block 1000(mem location) 
int *p = 20;
printf("%d",*p); //This pointer prints 20 
delete p; 
printf("%d",*p); // This would throw an error, because now p is 
                 // inaccessible or dangling. *p is a dangling pointer.

垃圾:已在堆上分配且尚未显式释放,但程序无法访问的内存。Java 有一个垃圾收集器。它及时删除悬空指针和其他垃圾内存。

于 2015-12-07T08:28:53.790 回答