全球旧事资料 分类
ifSomethi
gr
r
retur
r
r
r
r
pDCSelectObjectpOldBmpr
r
retur
r
r
r
例二r
r
当函数Somethi
g返回非零的时候,程序在退出前没有把pOldBmp选回pDC中,这会导致pOldBmp指向的HBITMAP对象发生泄漏。这个程序如果长时间的运行,可能会导致整个系统花屏。这种问题在Wi
9x下比较容易暴露出来,因为Wi
9x的GDI堆比Wi
2k或NT的要小很多。r
r
内存泄漏的发生方式:r
r
以发生的方式来分类,内存泄漏可以分为4类:r
r
1常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。比如例二,如果Somethi
g函数一直返回True,那么pOldBmp指向的HBITMAP对象总是发生泄漏。r
r
2偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。比如例二,如果Somethi
g函数只有在特定环境下才返回True,那么pOldBmp指向的HBITMAP对象并不总是发生泄漏。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。r
r
3一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,但是因为这个类是一个Si
gleto
,所以内存泄漏只会发生一次。另一个例子:r
r
charg_lpszFileNameNULLr
r
voidSetFileNameco
stcharlpcszFileNamer
r
r
r
ifg_lpszFileNamer
r
freeg_lpszFileNamer
r
r
r
g_lpszFileNamestrduplpcszFileNamer
r
r
r
例三r
r
如果程序在结束的时候没有释放g_lpszFileName指向的字符串,那么,即使多次调用SetFileName,总会有一块内存,而且仅有一块内存发生泄漏。r
r
4隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。举一个例子:r
r
classCo
ectio
r
r
r
r
publicr
r
Co
ectio
SOCKETsr
r
Co
ectio
r
r
…r
r
privater
r
SOCKET_socketr
r
…r
r
r
r
classCo
ectio
Ma
agerr
r
r
r
publicr
r
Co
ectio
Ma
agerr
r
r
r
Co
ectio
Ma
agerr
r
listiteratoritr
r
forit_co
listbegi
it_co
liste
ditr
r
delete(it)r
r
r
_co
listclearr
r
r
r
voidO
Clie
tCo
ectedSOCKETsr
r
Co
ectio
p
ewCo
ectio
sr
r
_co
listpush_backpr
r
r
r
voidO
Clie
tDisco
ectedCo
ectio
pco
r
r
_co
listremovepco
r
r
deletepco
r
r
r
r
privater
r
r
好听全球资料 返回顶部