C++中避免内存泄漏的几个绝招(一)

C++程序对内存资源的管理,直接影响到整个程序的性能。内存泄漏可以说是每一个程序员的天敌。然后只要了解C++的特性,养成良好的编程习惯,我们还是可以将这种风险降至最低的。为了使自己编写的程序内存资源管理更加安全可靠,故写此文,总结几个内存资源管理的绝招。

1. 用类指针(point-like)对象代替原始指针(raw point)

大家都清楚,要对于C#,指针是C++的一种特性。使用指针能给我们带来巨大的方便,但如果使用不旦,内存动态分配以后没有及时收回,那么系统的内存资源极有可能泄漏,直至造成程序崩溃。

例如:

class A {……};             //定义一个类型A

定义好一个对象后,我们一般可以用new方法,来创造一个对象实例。

A *pA = new A;              //动态分配一个内存,用new方法,相应的就需要调用delete方法,将该内存进行回收

然而,在大量的程序代码中,直接针对每一个new,使用一个delete的方式,存在以下几个问题:

1)  程序进行维护期间,开发人员若不慎增加循环、条件控制流语句,程序在未触及到delete时,就运行了return;

2) 在new和delete之间,由于运行了某些操作,导致出现异常。

因此,我们不能百分百保证,delete语句总是会执行。为了确保内存资源总是能够回收,我们可以将指针,用一个对象来进行操作,从而利用C++的“析构函数自动调用机制”自动释放内存资源。在标准的程序库中,提供了auto_ptr和tr1::shared_ptr两种指针对象,我们也可以称之为智能指针,采用这种指针对象,当对象的生命周期结束时,其析构函数将自动调用delete。其用法如下:

std::auto_ptr<A> pA(new A);
std::tr1::shared_ptr<A> pA(new A);

这两个指针对象的区别之处在于:多个auto_ptr不能同时指向同一对象;而多个shared_ptr则可以指向同一对象。正是因为这个不同,造成两者在处理copy构造函数和copy assignment操作符时,也不尽相同。auto_ptr的复行为具有特殊性:

std::auto_ptr<A> pA1(new A);
std::auto_ptr<A> pA2(pA1);      //pA2指向对象,而pA1为空
pA1 = pA2;                      //pA1指向对象,而pA2为空






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值