三、記憶體分配和釋放
自從學習了c語言,老師就教導我們說:對於動態記憶體的申請和釋放,一定要遵守「誰申請,誰釋放」的原則。在此原則的指導下,不僅是我、不僅是你,就連特級大師都設計了這樣怪怪的函式:
函式說明
getwindowtext(hwnd,lptstr,int)
取得視窗標題。需要在引數中給出儲存標題所使用的記憶體指標,和這塊記憶體的尺寸。
暈!我又不知道視窗標題的長度,居然還要我提供尺寸?!沒辦法,只能估摸著給乙個大一些的尺寸吧。
sprintf(char *,const char *,...)
格式化乙個字串。這個函式不用給出緩衝區的長度啦。
恩,雖然不用給出長度了,但你敢給個小尺寸嗎?哼!
int clistbox::gettextlen(int)
clistbox::gettext(int,lptstr)
取得列表窗中子專案的標題。需要呼叫兩個函式,先取得長度,然後分配記憶體,再實際取得標題內容。
真煩!
說實在的,不但函式呼叫者感覺彆扭,就連函式設計者心情也不會爽的,而這一切都是為了滿足所謂「誰申請,誰釋放」的原則。 解決這個問題最好的方式就是:函式內部根據實際需要動態申請記憶體,而呼叫者負責釋放。這雖然違背了上述原則,但 com 從方便性和效率出發,確實是這麼設計的。
c語言c++語言windows 平台comimalloc 介面bstr
申請malloc()
newglobalalloc()
cotaskmemalloc()
alloc()
sysallocstring()
重新申請realloc()
globalrealloc()
cotaskrealloc()
realloc()
sysreallocstring()
釋放free()
delete
globalfree()
cotaskmemfree()
free()
sysfreestring()
以上這些函式必須要按型別配合使用(比如:new 申請的記憶體,則必須用 delete 釋放)。在 com 內部,當然你可以隨便使用任何型別的記憶體分配釋放函式,但元件如果需要與客戶進行記憶體的互動,則必須使用上表中的後三類函式族。
1、bstr 內存在上回書中,已經有比較豐富的介紹了,不再重複;
2、cotask***()函式族,其本質上就是呼叫c語言的函式(malloc...);
3、imalloc 介面又是對 cotask***() 函式族的乙個包裝。包裝後,同時增強了一些功能,比如:imalloc::getsize()可以取得尺寸,使用 imallocspy 可以監視記憶體的使用;
記憶體分配和釋放
自從學習了c語言,老師就教導我們說 對於動態記憶體的申請和釋放,一定要遵守 誰申請,誰釋放 的原則。在此原則的指導下,不僅是我 不僅是你,就連特級大師都設計了這樣怪怪的函式 函式說明 getwindowtext hwnd,lptstr,int 取得視窗標題。需要在引數中給出儲存標題所使用的記憶體指標...
堆記憶體的分配和釋放
示例 int i 10 int p int malloc sizeof int 在堆中分配乙個整數大小的記憶體.printf p,d n i,i printf p,d n p,p free p 必須要手動釋放堆記憶體.特殊示例 int main void test char p 列印結果 null ...
UEFI EDKII 記憶體的分配和釋放細節
記憶體的分配和釋放作為一種 該函式實現了以位元組為單位的儲存空間分配,edkii 中對這種非頁面的儲存空間使用了如下資料結構 來管理。each element is the sum of the 2 previous ones this allows us to migrate blocks bet...