libgc是一个保守的内存垃圾清理器,它会周期性的扫描程序中的数据,并标记所有的当前在heap对象中正在被使用的内存,随后释放所有未被标记的的内存。
但是,libgc不会检测使用libgc以外的allocator分配的内存空间,也不会对其进行自动的释放。
使用libgc可以解决一下问题:
1、内存的泄露;2、未分配空间就释放(premature frees); 3、内存的碎片。
但它不能解决内存被重写造成的问题。
具体使用:
1、先到 http://www.hpl.hp.com/personal/Hans_Boehm/gc/网站下载软件,包名字为gc.tar.gz
1.
./configure --prefix=……
2.
make
3.
make
install
2、把头文件<~/gc/include/gc.h>放到方便的地方。
3、编译时连接gc库:方法1:动态链接 gcc memgc.c -lgc -ldl 使用libgc.so, libdl.so两个库
方法2:静态链接 gcc memgc.c ~/gc/lib/libgc.a -lpthread 使用libpthread.so
注:静态链接的好处是可以拷贝到类似的系统中用,而不需要在那台机器上安装gc库
用法示范:
1. 把GC作为内存泄漏的检测工具, 方法如下:
01.
#include "../gc/include/leak_detector.h"
02.
03.
int
main()
04.
{
05.
int
*p[10];
06.
int
i;
07.
GC_find_leak = 1;
08.
//如果去掉这一句,就变成了标准的GC功能,这一句使它按内存检测方式运行
09.
for
(i = 0; i < 10; ++i)
10.
{
11.
p[i] = (
int
*)
malloc
(
sizeof
(
int
)+i);
12.
}
13.
for
(i = 2; i < 10; ++i)
14.
{
15.
free
(p[i]);
16.
}
17.
for
(i = 0; i < 9; ++i)
18.
{
19.
p[i] = (
int
*)
malloc
(
sizeof
(
int
)+i);
20.
}
21.
CHECK_LEAKS();
22.
//标准GC不需要这一句,这里强制GC_gcollect();
23.
}
编译运行如下:
gcc a.c -lgc -ldl 或者 gcc a.c libgc.a -lpthread
./a.out
显示:
Leaked composite object at 0×805bff0 (b.c:10, sz=5)
Leaked composite object at 0×805afe8 (b.c:10, sz=4)
当我们调试结束后,可以把检测去掉就可以了.
2.一个更有意义的做法是,我们使用标准GC的功能,那么我们根本不用释放申请的内存,不用时就忘掉它好了.
01.
#include "../gc6.1/include/gc.h"
02.
#define malloc(n) GC_malloc(n)
03.
//这样可以方便的使用而不改程序中原有的malloc
04.
#include ;
05.
int
main()
06.
{
07.
int
i;
08.
char
*p;
09.
for
(i = 0; i < 10000; ++i)
10.
{
11.
p =
malloc
(100000*
sizeof
(
int
));
12.
//malloc许多次,没有free
13.
if
(p==0)
14.
{
15.
printf
(
"No memory/n"
);
exit
(1);
16.
}
17.
}
18.
}
编译 gcc b.c -lgc -ldl 或者 gcc b.c /usr/local/lib/libgc.a -lpthread
./a.out &
运行时,不会把内存用光的.不会显示No memory信息.
转自:http://www.gomudemi.org/?p=43