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

来源:互联网 发布:c 语言declaration 编辑:程序博客网 时间:2024/04/28 16:17

2. 成对使用new与delete时应采用相同的形式

一般来讲,new方法可以用于创建单对对象,也可以用于创建数组对象。同样,针对单个对象与数组,调用delete的形式也不尽相同。如下所示的一个例子,就是new与delete调用形式不匹配,从而造成内存没有成功释放。

string* sArray = new string[100];……delete sArray;

由于sArray是一个数组,因而上述的100个string对象,就必须调用100次析构函数才能完全释放内存,因而正确的做法是:

delete [] sArray;

因此,如果你在new表达式中使用[ ],必须在相应的delete表达式中也使用[ ]。如果你在new表达式中不使用[ ],那相应的delete表达式也不能使用[ ]。


3. 在独立的语句中构建智能指针

考虑到如下的函数:

void f(std::tr1::shared_ptr<A> pA(new A), fun());
编译器在调用f函数的具体内容前,首先要处理被传递的各个实参。上述第一个参由两部分构成:执行new A,然后调用std::tr1::shared_ptr构造函数。所在编译器在调用f之前,必须做三件事:

1. 调用函数fun

2. 执行new A

3. 调用tr1::shared_ptr构造函数

然后,对于C++来讲,编译器的执行顺序是不确定的,如果最终的操作顺序是这样:

1. 执行new A

2. 调用函数fun

3. 调用tr1::shared_ptr构造函数

如果是这样,假如在调用函数fun时,发现了异常,此时new A返回的指针将会遗失,而且没有放入tr1::shared_ptr中,所以就可能在调用这个函数时引发内存泄漏。为了避免这种问题,一般采用两条语句来实现上述代码,如下:

std::tr1::shared_ptr<A> pA(new A);f(pA, fun());




原创粉丝点击