GC如何知道哪个内存要解除分配?

时间:2015-08-28 06:42:14

标签: c++ garbage-collection

我对C ++中的垃圾收集器感到好奇。我可以理解他们可以通过使用他们的分配方法来控制内存分配。像Boehm GC

#include "gc.h"
#include <assert.h>
#include <stdio.h>

int main()
{
  int i;

  GC_INIT();    /* Optional on Linux/X86; see below.  */
  for (i = 0; i < 10000000; ++i)
   {
     int **p = (int **) GC_MALLOC(sizeof(int *));
     int *q = (int *) GC_MALLOC_ATOMIC(sizeof(int));
     assert(*p == 0);
     *p = (int *) GC_REALLOC(q, 2 * sizeof(int));
     if (i % 100000 == 0)
       printf("Heap size = %d\n", GC_get_heap_size());
   }
  return 0;
}

但我不明白GC如何知道该变量已不再使用?它应该被解除分配。

1 个答案:

答案 0 :(得分:0)

垃圾收集就是指针。如果您可以通过跟随指针链到达已分配的内存块,那么该内存块仍可能正在使用中,并且不应被释放。 C ++的难点在于知道什么是指针,什么不是。编译C ++后,很难区分指针和整数

Boehm是所谓的保守垃圾收集,实质上意味着它假设一切都是指针。这意味着有时它不会释放内存。也许整数变量的值与分配的内存块的地址相同。

即便如此,仍然可以用C ++这样的语言欺骗Boehm,它可以操纵指针(例如使用指针算法),因此Boehm最终会释放仍在使用的内存。