C C 使用Lu鍵樹實現智慧型指標及檢查記憶體洩露

2022-09-23 23:30:14 字數 3533 閱讀 8042

歡迎訪問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...