自從學習了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 可以監視記憶體的使用;