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

标签 arrays garbage-collection heap-memory d

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

我正在考虑这样做:

{
    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?

最佳答案

您的方案将起作用。

两件事情:

  • 垃圾收集器是保守的。这意味着它会扫描堆栈、寄存器和 GC 堆的原始字。任何看起来像指向 GC 分配的内存的指针都会被认为是这样的,因此保持那 block 内存处于事件状态。
  • 垃圾收集器允许内部指针。原因有两个。首先,(在系统语言中)仅使用指针算术迭代原始内存是相当普遍的,因此 GC 必须处理这样的情况,其中只有一个偏移量指针指向 GC 内存。其次,D 中的接口(interface)实际上只是从基础对象的偏移量,因此这些需要保持原始对象处于事件状态。

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

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

    关于arrays - 垃圾收集器是否保留仅由原始指针引用的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12192691/

    相关文章:

    ruby - 在 Ruby 中删除一个对象

    Java GC(分配失败)

    javascript - 如何将一组对象添加到单个数组中?

    代码错误 无法插入字符

    arrays - ELM 如何解码 json 数组中的不同值

    android - 调用 KeyChain.getPrivateKey 后运行 GC 时出现致命信号 11 (SIGSEGV)

    c++ - Char 数组指针返回不正确(当前年份 ctime)

    java - Java 堆分析工具的推荐?

    c++ - c++中的唯一/智能指针 vector

    c++ - 我应该只为一个电话在免费商店上创建对象吗?