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