资源分配、释放表


资源

分配函数

清除函数

需要手动清除

Accelerators

LoadAccelerators

N/A

No

Atoms

GlobalAddAtom

GlobalFreeAtom

Yes

Bitmaps

CreateBitmap

DeleteObject

Yes *

 

CreateBitmapIndirect

DeleteObject

Yes *

 

CreateCompatibleBitmap

DeleteObject

Yes*

 

CreateDIBitmap

DeleteObject

Yes*

 

CreateDiscardableBitmap

DeleteObject

Yes*

 

LoadBitmap

DeleteObject

Yes

 

 

 

 

Brushes

CreateBrushIndirect

DeleteObject

Yes

 

CreateDIBPatternBrush

DeleteObject

Yes

 

CreateHatchBrush

DeleteObject

Yes

 

CreatePatternBrush

DeleteObject

Yes

 

CreateSolidBrush

DeleteObject

Yes

Carets

CreateCaret

DestroyCaret

No#

Clipboard

OpenClipboard

CloseClipboard

Yes

Comms Ports

OpenComm

CloseComm

Yes

Cursor

CreateCursor

DestroyCursor

Yes

 

LoadCursor

N/A

No

DC

CreateDC

DeleteDC

Yes

 

CreateCompatibleDC

DeleteDC

Yes@

 

GetDC

ReleaseDC

Yes

 

GetWindowDC

ReleaseDC

Yes

 

BeginPaint

EndPaint

Yes

DialogBox

CreateDialog

DestroyWindow

No

 

CreateDialogIndirect

DestroyWindow

No

 

CreateDialogIndirectParam

DestroyWindow

No

 

CreateDialogParam

DestroyWindow

No

File

OpenFile

_lclose

No

Fonts

CreateFont

DeleteObject

Yes

 

CreateFontIndirect

DeleteObject

Yes

 

AddFontResource

RemoveFontResource

Yes

GDIStockObj

GetStockObject

N/A

No&

Hook

SetWindowsHook

UnhookWindowsHook

Yes

IC

CreateIC

DeleteDC

Yes

Icon

CreateIcon

DestroyIcon

Yes

 

LoadIcon

N/A

No

Library

LoadLibrary

FreeLibrary

Yes

Memory

AllocDStoCSAlias

FreeSelector

Yes

 

AllocSelector

FreeSelector

Yes

 

GlobalAlloc

GlobalFree

No

 

GlobalDOSAlloc

GlobalDOSFr

No

 

GlobalFix

GlobalUnfix

No

 

GlobalLock

GlobalUnlock

No

 

GlobalPageLock

GlobalPageUnlock

No

 

GlobalRealloc

GlobalFree

No

 

GlobalWire

GlobalUnwire

No

 

LocalAlloc

LocalFree

No

 

LocalLock

LocalUnlock

No

 

LocalRealloc

LocalFree

No

Menu

CreateMenu

DestroyMenu

No%

 

CreatePopupMenu

DestroyMenu

No%

 

LoadMenu

DestroyMenu

No%

 

LoadMenuIndirect

DestroyMenu

No%

 

GetSystemMenu

N/A

No

MetaFile

CreateMetaFile

DeleteMetaFile

Yes

Palette

CreatePalette

DeleteObject

Yes

Pen

CreatePen

DeleteObject

Yes

 

CreatePenIndirect

DeleteObject

Yes

Regions

CreateEllipticRgn

DeleteObject

Yes

 

CreateEllipticRgnIndirect

DeleteObject

Yes

 

CreatePolygonRgn

DeleteObject

Yes

 

CreatePolyPolygonRgn

DeleteObject

Yes

 

CreateRectRgn

DeleteObject

Yes

 

CreateRectRgnIndirect

DeleteObject

Yes

 

CreateRoundRectRgn

DeleteObject

Yes

Resource

AllocResource

FreeResource

No

 

FindResource

N/A

No

 

Load Resource

FreeResource

No

 

LockResource

UnlockResource

No

Sound

OpenSound

CloseSound

Yes

String

LoadString

N/A

No

Thunk

MakeProcInstance

FreeProcInstance

No

Timer

SetTimer

KillTimer

No

Window

CreateWindow

DestroyWindow

No

 

CreateWindowEx

DestroyWindow

No

 * 位图资源在释放的时候必须从选中它的DC中脱离。

当菜单失去焦点和窗口不再关联或者应用程序结束的时候占用资源必须被释放。
@ DC
被释放前必须和它关联(选中)的位图取消联系
如果脱字符指定了位图,位图必须被释放
DeleteObject的调用不会销毁常规的StockObject(系统内定资源)


变量分配时会有两种情况,一个是在栈中分配,一个是在堆中分配。
在栈中分配的变量不用delete的,函数结束后自动释放;
在堆分配,也就是用mallocnew等分配的内存,要自己调用相应的freedelete释放。

DeleteObject( )这个函数经常会遇到,比如CPen 的DeleteObject,CDC的DeleteObject,CBitmap的DeleteObject。

这个DeleteObject函数是用来清除CBitmap ,CPen,CDC中选入的对象的。比如CBitmap用LoadBitmap载入的位图。CPen用CreatePen建出来的笔。
只有在DeleteObject清除这些对象中的对象数据之后才能选入其他的东西。只有DeleteOBject之后CBitmap对象才能调用LoadBitmap第二次载入位图,CPen对象才能第二次创建新画笔。  
当CDC不使用选入的对象时,都要用SelectObject选入旧的对象,这样刚才使用的那些对象都自由,这样就可以被释放了。
Delete CBitmap对象,Delete CPen对象才能把对象删除。

 

posted @ 2016-11-10 10:04  fyk1Ex  阅读(170)  评论(0)    收藏  举报