对象的动态分配

对象的动态分配(Dynamically Allocated Object)

 

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

=============================================================================================================================

转载自:http://www.cppblog.com/road420/archive/2006/10/23/14048.html?opt=admin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值