代码之家  ›  专栏  ›  技术社区  ›  TommiT

垃圾收集器是否保留仅由原始指针引用的数组?

  •  8
  • TommiT  · 技术社区  · 14 年前

    我想从垃圾收集堆中分配一个元素数组,并仅通过原始指针访问这些元素。垃圾收集器是否能够在所有指向它的指针都超出范围之后(而不是之前)回收该内存块?

    我想这样做:

    {
        int* ptrToArray1 = (new int[](100)).ptr;
        int* ptrToArray2 = ptrToArray1;
        int* ptrToArray3 = ptrToArray1 + 10;
    
        ptrToArray1 += 50;
        ptrToArray2 += 99;
    
        *ptrToArray1 = 123;
        *ptrToArray2 = 456;
        *ptrToArray3 = 789;
    
        ptrToArray1 -= 42;
        ptrToArray2 -= 24;
    
        //... and so on ... Is the array data guaranteed to be there?
    }
    // Now that all the pointers are out of scope, can the
    // garbage collector reclaim the memory block of that array?
    
    1 回复  |  直到 14 年前
        1
  •  14
  •   user438034 user438034    14 年前

    你的方案会奏效的。

    两件事:

    1. 垃圾收集器是保守的。这意味着它扫描堆栈、寄存器和GC堆的原始字。任何看起来像指向GC分配的内存的指针的东西都会被认为是这样的,因此可以保持该内存的有效性。
    2. 垃圾收集器允许内部指针。原因有两方面。首先,(在系统语言中)只使用指针算术在原始内存中迭代是很常见的,因此GC必须处理这样的情况,即只有一个偏移指针指向GC内存。其次,D中的接口实际上只是基本对象的偏移,因此这些接口需要保持原始对象的活动状态。

    值得注意的是,内部指针显著降低了垃圾收集器的标记阶段,但在像D这样的系统语言中,不支持内部指针是不合理的。

    最后,请注意,如果在GC堆和堆栈/寄存器之外存储指向GC分配的内存的指针, GC不会拾取它 。也就是说,如果您存储一些数组 .ptr 在某些方面 malloc d内存,然后丢弃所有对它的引用,例如,它不会被认为是活的。