【问题标题】:What is the difference between garbage and dangling references?垃圾引用和悬空引用有什么区别?
【发布时间】:2011-08-19 12:00:49
【问题描述】:

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

【问题讨论】:

    标签: pointers memory-management reference garbage


    【解决方案1】:

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

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

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

    int * p = new int;
    delete p;
    
    int i = *p; // error, p has been deleted!
    

    【讨论】:

      【解决方案2】:

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

      什么是垃圾取决于你的垃圾收集器的实现。

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

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

      【讨论】:

        【解决方案3】:

        悬空引用:对最初分配但现在被释放的内存地址的引用

        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 有一个垃圾收集器。它及时删除悬空指针和其他垃圾内存。

        【讨论】:

          猜你喜欢
          • 2011-12-14
          • 1970-01-01
          • 1970-01-01
          • 2011-04-09
          • 2012-12-23
          • 2012-07-31
          • 2013-02-05
          • 2013-07-06
          • 1970-01-01
          相关资源
          最近更新 更多