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*
类型。