对象内存管理经验谈

不得不说,C/C++强大的功能和灵活的操纵性,一直是我的至爱。哲人说过,任何事物都有其矛盾的两面性,此话诚不欺我也!C++,你把伟大的内存管理工作交给了我们,而我们却经常用不好你。

 

关于对象内存管理,最常见的问题就是:

1. 内存访问冲突,具体表现就是程序运行时,突然跳出一个警示框“0xFA012345……该内存不能为Read。”确定,程序崩溃。

2. 内存泄漏,这个一般很少表现出来,因为现在的机器越来越强悍了。但一旦内存不足了,问题会很严重,梨叔会很生气。

 

引起内存访问冲突的代码有以下几类:

1. 内存越界访问,如一个数组过界操作

2. 对象指针没有正确指向到有效对象,仍访问其成员(读写成员变量、调用成员函数、delete对象本身)。具体情况有:

    a. 对象指针为NULL时,仍然访问其成员

    b. 对象指针没正确指定对象时,仍然访问其成员。如未初始化,造成随机指向到系统内存;或者对象已经析构过,但没有通知到该指针。

 

引起内存泄漏,最根本原因就是内存有分配(new)没释放(delete)。

 

我最常患的一个错误就是,为了防止内存泄漏,经常过多地使用了delete操作符,结果又造成内存访问冲突,因为对象delete后再delete了。当然,第一次delete操作是在其它模块中,我甚至无法预测它是在什么时候被delete的。

 

系统(程序)稍微复杂一些,就得用各种容器保存对象(通常是指针或引用),而这些对象一般是共享的,而且创建对象的方式多样性和位置不确定性,造成了上面提到的对象内存管理最常出现的两个问题。

 

对于这些“低级”问题,前辈们早就有了应对之道,那就是智能指针和引用计数。这些特性,高手们甚至准备把它写到C++的新标准中。

 

我却一直没有勇气用它。因为我怕使用智能指针和引用计数会大大降低程序的性能,毕竟要多访问一重嘛。但这仍然是借口,最根本的原因是,本人懒,懒到懒得用它,想想,代码中每一次GetObject()后,都要pObj->Release(),我有点受不了。还有一个借口就是,怕这些高级特性不能被项目组中每一位成员理解,利器用得不当,反而是害了自己。

 

没有使用智能指针和引用计数,为了避免内存管理可能引发的问题和混乱,我只能在类的接口函数中,以注释和文档的形式注明,传入或传出的对象(指针),是由外部客户代码管理其生存期(主要是创建和销毁),还是由本类自己管理,外部勿需多管闲事。以后,不管是实现接口的具体类,还是使用服务的客户类,都必须严格按照这个约定来行事。

 

但这种对象内存管理的声明,其作用还是有限的,只不过把它明文化了罢。

 

寻求更完美的解决方案……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值