1. 用new/malloc显式分配在堆上的内存才需要用delete/free释放,而在栈上分配的如int array[80]在子程序结束时自动释放,分配与释放都和数据类型无关。
2. delete一个指针的时候 一定要检查是否为null,否则是个严重的应用程序错误.
3.释放一个数组要用delete []
4.类对象使用结束后将其delete,不delete的话,当程序退出的时候,内存都会被系统释放,不会有内存泄漏的问题.
内存泄漏说的是 长时间运行的程序(几年几月),如果不管理好你的内存,到时候会无内存可用.???
附:摘抄一个析构函数注释
CMyPoint::~CMyPoint() { //析构函数
//delete一个指针的时候 一定要检查是否为null,否则是个严重的应用程序错误.
//由于m_pName是用new 产生的空间 所以需要 delete来释放掉, new的东西都不会自己消除,需要我们在适合的使用调用delete
if(m_pName!=NULL) {
delete []m_pName; //因为它是一个数组所以需要用delete []
m_pName=NULL; //将它设置为null 防止再次使用这个指针去访问原来的地址,原来的地址已经被我们delete了.但编译器不会帮我们自动清它为null 所以我们自己清.
}
}
Resource Allocation Routine Cleanup Routine Cleanup Required?
================================================================================
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
Dialog Box 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
GDI Stock Obj 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
LoadResource 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
Notes:
------
* Bitmaps must be disconnected from a DC before being freed.
% Menus must be freed before an application exits if the menu is not
connected to any window.
@ A DC must be disconnected from bitmaps before being freed.
# If a bitmap is specified for the Caret, it must be freed.
& Calls to DeleteObject do not harm stock objects.