歡迎訪問lu程式設計
c/c++使用lu鍵樹實現智慧型指標及檢查記憶體洩露
1 說明
要演示本文的例子,你必須**lu32指令碼系統。本文的例子需要lu32.dll、lu32.lib、c++格式的標頭檔案lu32.h,相信你會找到並正確使用這幾個檔案。
用c/c++編譯器建立乙個控制台應用程式,複製本文的例子**直接編譯執行即可。
2 關於智慧型指標及lu實現
由於 c/c++ 語言沒有自動記憶體**機制,程式設計師每次
malloc/new 出來的記憶體都要手動 free/delete。由於程式流程太複雜,程式設計師容易忘記 free/delete,造成記憶體洩露。c++用智慧型指標可以有效緩解這類問題,例如:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost::intrusive_ptr等等,可謂種類繁多。
實際上,c/c++程式使用lu指令碼的鍵樹系統也可以解決此類問題,而且程式設計師可以方便地查詢哪塊記憶體忘記了free/delete。閱讀完本文,你就可以嘗試使用lu指令碼系統查詢你的c/c++程式是否存在記憶體洩露了。
關於lu指令碼鍵樹系統,可以參考lu程式設計指南,同時參考這個教程:c/c++使用lu指令碼字串鍵樹。
3****1:實現智慧型指標
#include
#include
#include "lu32.h"
#pragma comment( lib, "lu32.lib" )
using namespace std;
#define key_****** (luprikey_user-20) //將對該私有鍵加鎖
#define imax 5 //私有鍵值最大數
void _stdcall del_******(void *me); //銷毀******的函式
class ****** //編寫乙個簡單的類幫助測試
; ~******()
cout << "~******: " << number << endl;
};};
void _stdcall del_******(void *me) //銷毀******的函式,將註冊到lu系統,以實現自動銷毀******
}ludata _stdcall oplock_******(luint m,ludata *para,void *hfor,int theoperator) //******的運算子過載函式
void main(void)
; ~******()
cout << "~******: " << number << endl;
};};
void _stdcall del_******(void *me) //銷毀******的函式,將註冊到lu系統,以實現自動銷毀******
}ludata _stdcall oplock_******(luint m,ludata *para,void *hfor,int theoperator) //******的運算子過載函式
int _stdcall getkey******value(char *keystr,int bytenum,void *keyvalue) //列舉lu系統中指定鍵值型別的所有物件
void main(void)
; ~******()
//銷毀物件的其他**
};};
void _stdcall del_******(void *me) //銷毀******的函式,將註冊到lu系統,以實現自動銷毀******
}ludata _stdcall oplock_******(luint m,ludata *para,void *hfor,int theoperator) //******的運算子過載函式
class ******cpp //編寫乙個簡單的類幫助測試:不使用lu系統
; ~******cpp()
;};void main(void)
; ~******()
//銷毀物件的其他**
};};
****** *new******(int param=0) //設計專用的生成******的函式
else //生成新的物件並初始化
return p******;
}void _stdcall del_******(void *me) //銷毀******的函式,將註冊到lu系統,以實現自動銷毀******
}ludata _stdcall oplock_******(luint m,ludata *para,void *hfor,int theoperator) //******的運算子過載函式
class ******cpp //編寫乙個簡單的類幫助測試:不使用lu系統
; ~******cpp()
;};void main(void)
{ ****** *p******[imax];
******cpp *p******cpp[imax];
int i,j;
clock_t start, end;
start = clock();
for(j=0;j
執行結果:
--- c/c++ 系統執行時間 : 234 ms.
--- c/c++ lu 復合系統執行時間 : 125 ms.
4函式說明
本例用到了lu的7個輸出函式:初始化lu的函式initlu,釋放lu的函式freelu,插入鍵值的函式insertkey,刪除鍵值的函式deletekey,加鎖鍵函式lockkey,列舉鍵值的函式enumkey,從緩衝池中獲取乙個物件的函式getbufobj。從這裡檢視這些函式的說明:lu程式設計指南。
5難點分析
**1實現了智慧型指標。對c/c++程式來說,僅需要在類的建構函式和析構函式中新增幾行**;當然,載入lu核心庫、對指定的資料型別進行加鎖和解鎖還是必不可少的。
**2在**1的基礎上實現了對c/c++程式記憶體洩露的檢查。僅增加了乙個列舉鍵值的函式enumkey。
**3對使用lu智慧型指標的物件生成及銷毀效率進行了測試,並與c/c++做了比較,結果表明:在不使用lu緩衝池時,c/c++和lu復合程式的效率約為c/c++程式的1/50左右。
**4仍然對使用lu智慧型指標的物件生成及銷毀效率進行測試,但使用lu緩衝池,結果表明:在使用lu緩衝池時,c/c++和lu復合程式的效率接近c/c++程式的2倍。使用lu緩衝池需要付出的代價是,你必須專門設計乙個生成物件的函式來代替new操作符,銷毀物件時也不要直接delete,而要使用lu系統的函式deletekey。另外,**4在小範圍內進行了物件的生成及銷毀的測試(物件數目
imax=10),充分利用了lu緩衝池,這是符合一般程式運**況的;如果修改**4中的 imax=1000 及kmax=1000(迴圈次數)再進行測試,將會發現,c/c++和lu復合程式的效率將退化為**3的情況。
6 其他
你可能注意到了,我的****就在下面,如有不明之處或有什麼建議,可隨時與我進行聯絡。
e-mail: [email protected] qq:630715621
最近更新: 2023年01月03日
C C 使用Lu鍵樹實現智慧型指標及檢查記憶體洩露
lu程式設計 c c 使用lu鍵樹實現智慧型指標及檢查記憶體洩露 1 說明 lu32.h,相信你會找到並正確使用這幾個檔案。用c c 編譯器建立乙個控制台應用程式,複製本文的例子 直接編譯執行即可。2 關於智慧型指標及lu實現 由於 c c 語言沒有自動記憶體 機制,程式設計師每次 malloc n...
c c 智慧型指標 unique ptr 使用
智慧型指標 unique ptr 使用 操作功能描述 unique ptru q 智慧型指標u管理內建指標q所指向的物件 q必須指向new分配的記憶體,且能夠轉換為t unique ptru u,d 用型別為d的物件d來代替delete u nullptr 釋放u指向的物件,並將u置為空 u.rel...
c c 陣列的智慧型指標 使用
1,unique ptr的陣列智慧型指標,沒有 和 操作,但支援下標操作 2,shared ptr的陣列智慧型指標,有 和 操作,但不支援下標操作,只能通過get 去訪問陣列的元素。3,shared ptr的陣列智慧型指標,必須要自定義deleter 小例子 include include incl...