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为空