Boehm gc
附上編譯的程式庫 http://damody.googlecode.com/files/gc-7.1-vc2008.7z

windows下靜態編譯,我加上的define
GC_BUILD;GC_THREADS;_CRT_SECURE_NO_WARNINGS;GC_WIN32_THREADS;LARGE_CONFIG;GC_NOT_DLL;ASSUME_VISTA;ENABLE_TRACE
ENABLE_TRACE
打開TRACE可以找leak
ASSUME_VISTA
AO_CAN_EMUL_CAS
使用vista以上的同步函數
GC_BUILD
編譯成程式庫
GC_THREADS;GC_WIN32_THREADS
可以使用gc_beginthread函數
_CRT_SECURE_NO_WARNINGS
減少警告
LARGE_CONFIG
加大可以分配的空間
GC_NOT_DLL
靜態編譯

GC_INIT();
可以不用呼叫,會自動呼叫。

在目標程式的define
#define GC_NOT_DLL
可以用 putenv("GC_FIND_LEAK=1");
加入對gc的設定。

可以用以下設定重載c函數

#define malloc(n) GC_MALLOC(n)
#define calloc(m,n) GC_MALLOC((m)*(n))
#define free(p) GC_FREE(p)
#define realloc(p,n) GC_REALLOC((p),(n))

由於gc會有重載c++ new跟delete函數,
所以就算new了之後自己delete也不會錯,
而如果要在不修改原code只修改main的方法加入gc,
要改他的source這個實力到了自然會改,就不多說了。

要找手動配置的pointer有沒有忘記的就用
putenv("GC_FIND_LEAK=1");
他會在你忘記delete時印到一個*.log裡。

一般來說如果你不想全用gc的話,
只要那個class有繼承gc那個class就會自動使用,
沒有繼承的就不會被自動回收。

就算沒有繼承也可以用
new(GC) int[10];
來強制使用gc,
或是有繼承的用
new(NoGC) int[10];
來取消使用。

GC_INITIAL_HEAP_SIZE=1638400
可以設定初始的heap大小,
如果設定了GC_MAXIMUM_HEAP_SIZE
那new了超過的大小,程式會結束。

經過小實驗,
以下代碼可以輕易媒合到main裡,
#define GC_NOT_DLL
#define GC_DEBUG
#define GC_ALL_INTERIOR_POINTERS
#include <gc_cpp.h>
#include <cstdlib>
#define malloc(n) GC_MALLOC(n)
#define calloc(m,n) GC_MALLOC((m)*(n))
#define free(p) GC_FREE(p)
#define realloc(p,n) GC_REALLOC((p),(n))
來產生一些memory leak的訊息

可以用以下的方法在靜態類別new之前先設定,
static struct __tag__first__
{
    __tag__first__()
    {
        putenv("GC_FIND_LEAK=1");
        GC_INIT();
    }
}__init__first__go__;

創作者介紹

!壞人必需做好事!

讓地獄深紅的天亮 發表在 痞客邦 PIXNET 留言(0) 人氣()