記憶體分配和釋放

2021-06-05 20:51:08 字數 1539 閱讀 1379

三、記憶體分配和釋放

自從學習了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...