2015-08-28 65 views
1

我對C++中的垃圾收集器很好奇。我可以理解他們可以通過使用他們的分配方法來控制內存分配。像Boehm GCGC如何知道要釋放哪個內存?

#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如何知道變量不再被使用?它應該被釋放。

回答

0

垃圾回收都是關於指針的。如果您可以通過遵循一系列指針來訪問已分配的內存塊,那麼該內存塊仍可能在使用中,因此不應該解除分配。 C++中的難點在於知道什麼是指針,什麼不是。一旦編譯了C++,很難區分指針和整數

Boehm是所謂的保守性垃圾回收機制,它基本上意味着它假設所有東西都是指針。這意味着有時它不會釋放內存。也許一個整型變量的值與分配的內存塊的地址相同。即使如此,仍然有可能欺騙Boehm,用像C++這樣的語言來操縱指針(例如使用指針算法),所以Boehm最終將釋放仍在使用中的內存。