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