天天看點

記憶體配置設定和釋放

     自從學習了C語言,老師就教導我們說:對于動态記憶體的申請和釋放,一定要遵守“誰申請,誰釋放”的原則。在此原則的指導下,不僅是我、不僅是你,就連特級大師都設計了這樣怪怪的函數:

 

函數

說明

評論

GetWindowText(HWND,LPTSTR,int)

取得視窗标題。需要在參數中給出儲存标題所使用的記憶體指針,和這塊記憶體的尺寸。

暈!我又不知道視窗标題的長度,居然還要我提供尺寸?!沒辦法,隻能估摸着給一個大一些的尺寸吧。

sprintf(char *,const char *,...)

格式化一個字元串。這個函數不用給出緩沖區的長度啦。

恩,雖然不用給出長度了,但你敢給個小尺寸嗎?哼!

int CListBox::GetTextLen(int)

CListBox::GetText(int,LPTSTR)

取得清單窗中子項目的标題。需要調用兩個函數,先取得長度,然後配置設定記憶體,再實際取得标題内容。

真煩!

  說實在的,不但函數調用者感覺别扭,就連函數設計者心情也不會爽的,而這一切都是為了滿足所謂“誰申請,誰釋放”的原則。 解決這個問題最好的方式就是:函數内部根據實際需要動态申請記憶體,而調用者負責釋放。這雖然違背了上述原則,但 COM 從友善性和效率出發,确實是這麼設計的。

C語言

C++語言

Windows 平台

COM

IMalloc 接口

BSTR

申請

malloc()

new

GlobalAlloc()

CoTaskMemAlloc()

Alloc()

SysAllocString()

重新申請

realloc()

GlobalReAlloc()

CoTaskRealloc()

Realloc()

SysReAllocString()

釋放

free()

delete

GlobalFree()

CoTaskMemFree()

Free()

SysFreeString()

  以上這些函數必須要按類型配合使用(比如:new 申請的記憶體,則必須用 delete 釋放)。在 COM 内部,當然你可以随便使用任何類型的記憶體配置設定釋放函數,但元件如果需要與客戶進行記憶體的互動,則必須使用上表中的後三類函數族。

  1、CoTaskXXX()函數族,其本質上就是調用C語言的函數(malloc...);

  2、IMalloc 接口又是對 CoTaskXXX() 函數族的一個包裝。包裝後,同時增強了一些功能,比如:IMalloc::GetSize()可以取得尺寸,使用 IMallocSpy 可以監視記憶體的使用;

繼續閱讀