1
、對象的分類
①???????
全局對象(
Global Object
)?????????????????????Controlled by System
②???????
局部對象(
Local Object
)????????????????????? Controlled by System
③???????
動態(tài)生成對象(
Dynamically Allocated Object
)
??
??
?
??controlled by programmer
?
2
、動態(tài)對象的生與死
①???????
創(chuàng)建:
new
②???????
銷毀:
delete
?
3
、動態(tài)對象的創(chuàng)建的地址
????????
內(nèi)存池(
memory pool
)中的一塊程序自由存儲區(qū)域(
free store area
),實際上就是通常所說的堆(
Heap
)
?
4
、動態(tài)對象的存在形式
①???????
簡單對象(
single object
)
②???????
對象數(shù)組(
array object
)
③???????
The placement new express
?
5
、動態(tài)對象的使用
①???????
動態(tài)對象的操縱
動態(tài)對象沒有名稱,而是返回分配對象的指針地址,所有操作都是通過指針間接完成
②???????
動態(tài)對象的初始化
動態(tài)對象分配的內(nèi)存區(qū)域是沒有初始化過的,里面存在的是隨機數(shù)據(jù)
?
6
、動態(tài)對象及指針的生命周期
①???????
動態(tài)對象
持續(xù)時間為
new
?
è
delete
②???????
指針
根據(jù)其自身類型決定(全局
/
局部)
?
7
、
delete
的使用
例
1
:
???????? int ?*pi=new int;
???????? if(pi!=0){
????????
? delete pi;
}??????
該段程序運行起來是沒有問題的,但是卻存在畫蛇添足的一筆:
if(pi!=0)
????????
原因是,
delete
會自動完成這個測試,如果顯式地測試,將會多執(zhí)行一次測試。所以說完全沒有必要。
????????
????????
例
2
:
?????????????????? pointer=0;??????????????????? //
不指向任何對象
?????????????????? delete pointer;????????????? //
沒有必要
????????
????????
總結(jié):
也許會有人覺得兩個例子似乎有點矛盾,其實上述例程的意思是:
①???????
當(dāng)我們不知道一個對象內(nèi)存是否已經(jīng)釋放的時候,直接
delete
即可,是沒有任何問題的;額外的判斷完全沒有必要,反而會增加系統(tǒng)的工作量。
②???????
當(dāng)我們明確地知道對象指針
==NULL
時,表明已經(jīng)釋了對象。這時就可以少寫一行代碼了。當(dāng)然如果有人想看看計算機又沒有不良反應(yīng),另當(dāng)別論。
同時也證明了①,刪除一個
NULL
對象是沒有任何問題的
?
8
、動態(tài)內(nèi)存分配常見錯誤
①???????
內(nèi)存泄露
我想這個問題對
C++
程序員來說,是非常熟悉的。
u???????
根源是:?
簡短的回答:
new
與
delete
沒有配對使用
明白了嗎?還不明白?
next
:
????????
????????
只給對象分配了內(nèi)存,但是直到關(guān)閉程序的時候,都還沒有向?qū)ο笠啬菈K內(nèi)存。
u???????
怎樣發(fā)現(xiàn)?
?????????
Vc IDE
中,
debug
狀態(tài),程序結(jié)束時
output
窗口的
Detect Memory leak
!
?????????
使用工具軟件,如:
BoundCheck
?
u???????
如何避免?
呵呵,知道了根源就應(yīng)該知道該咋辦了。。。
????????
②???????
讀
/
寫已經(jīng)刪除的對象(內(nèi)存)
當(dāng)對象
delete
以后,對象內(nèi)存被系統(tǒng)回收,其指針就指向到一塊非法的內(nèi)存。如果再對該對象指向內(nèi)存操作就會導(dǎo)致不可預(yù)知的錯誤。因此,通常的做法是
delete
之后,立即賦
NULL
?
③???????
內(nèi)存
corruptted
很熟悉,是吧?不要著急,請聽我慢慢道來。。。
????????
根源:
u???????
ptrA
與
ptrB
都指向同一塊內(nèi)存
u???????
通過
ptrA
釋放內(nèi)存
Mem0
,
Mem0
分配給其它對象
ptrC
u???????
ptrB
釋放內(nèi)存
, Mem0
存儲的
ptrC
指向的新對象就被破壞掉了。
u???????
再次對
ptrC
操作就會出錯
?
④???????
對象類型錯誤
例:
CDialog ?dlg=new CDialog
;
delete dlg
;
????????
????????
你能發(fā)現(xiàn)什么不對嗎?
??????????????????
提示一下,
debug
運行會發(fā)現(xiàn)
mem leak
!
??????????????????
知道了吧,
what
?
????????
????????
就是
delete dlg
。
??????????????????
在
5.1
中說過,
new
返回的是指針。所以應(yīng)該將
dlg
聲明為
CDialog*
類型。
?
這個主題的內(nèi)容就講完了,還有一些相關(guān)內(nèi)容在接下來的文章中見:
u???????
The placement new express
u???????
內(nèi)存沖突
u???????
內(nèi)存
corruptted
解決辦法