libgc 加 .make 在 vc6 vs2008 中的編譯方法
開源代碼多數是用 .mak 編譯 win 平臺,網上的教程多是說明命令行的,但這樣在裝了多個版本 vs 的電腦上很容易混亂,要每次執行不同的 vcvars32.bat 其實這個批處理不過是設置 sdk 的路徑等等,例如 "D:\Program Files\Microsoft Visual Studio 9.0\VC\bin\NMAKE" /f "D:\gs_d\vctest\gc-7.0\gc.mak" CFG="gc - Win32 Release"
那個 cfg 標誌是用來指定編譯版本的,實現可看對應的 mak,如果沒有執行那個 bat 文件夾的話就可能報 "NMAKE : fatal error U1073: don't know how to make '"\sys\TYPES.H"'"
其實不過是缺少 include 路徑環境變量罷了,這些其實是可以由 vs 來完成的,vc6下比較簡單,打開 .mak 文件會自動轉存爲 dsw ,但 vs2008 不行.不過我發現好象不支持一樣,實際也是可以的,我發現一個取巧的方式:先用vc6生成 dsw 再用 vs2008 打開就行了. 我覺得vs2008 還不可以直接建立 .mak 工程的,不過怎麼做還不明白.
用 vs 編譯的最大好處是可以方便的在其中調試代碼 -- 你用命令行不行吧?
--------------------------------------------------
最新的 libgc 不支持 vc6 ,不過修改一下就行,主要就是有些類型 vc6 不支持,在 vs2008 中參考寫一個就行了,例如
typedef unsigned __int64 uintptr_t;//clq test
typedef unsigned long ULONG_PTR, *PULONG_PTR;
//clq test//strcat_s(exePath, sizeof(exePath), "\\..");
strncat(exePath, "\\..", sizeof(exePath));
--------------------------------------------------
使用c/c++中的垃圾收集庫——libgc
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
void Cgct1Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
//AfxBeginThread(run, NULL);//不能這樣用,可能是要和 libgc 專用的線程啓動函數配合才行
//AfxBeginThread(run2, NULL);//不能這樣用,可能是要和 libgc 專用的線程啓動函數配合才行
GC_beginthreadex(NULL, 0, run, NULL, 0, NULL);
_beginthreadex(NULL, 0, run, NULL, 0, NULL);//#include <gc.h> 後才能自動 gc
//run(NULL);
}