C++技巧(标准auto,第1张

C++技巧(标准auto,第2张

很多人听说过标准的auto_ptr智能指针机制,但并不是每个人都每天使用它。太可惜了,因为auto_ptr优雅地解决了C++设计和编码中的常见问题,正确使用的话可以生成健壮的代码。本文解释了如何正确使用auto_ptr来使您的代码更加安全,以及如何避免对auto_ptr的危险但常见的误用,这将导致间歇性的攻击和难以诊断的错误。
为什么称之为“自动”指针?
auto_ptr只是许多可能智能指针之一。许多商业图书馆提供更复杂的智能指针,具有广泛的惊人用途,从管理参考文献的数量到提供高级代理服务。标准的C++ auto_ptr可以看作是智能指针的福特护卫(elmar注:可能指适合家用的福特型号):简单通用的智能指针,不包含所有的提示,没有专用或高性能智能指针那么豪华,但可以很好地完成很多常见的工作,非常适合日常使用。
auto _ ptr所做的是动态分配对象,并在不再需要时自动清理它们。下面是一个简单的代码示例,因为没有使用auto_ptr所以不安全:
/示例1(a):原代码
/
void f()
{
t * pt(newt);
删除pt;
}
我们大多数人每天都在写类似的代码。如果f()函数只有三行,不会有什么意外,那么这样做可能是好的。但是如果f()从不执行delete语句,或者是由于过早返回,或者在执行函数体时抛出异常,那么这个分配的对象就不会被删除,这样就出现了经典的内存泄漏。
使例1(a)安全的简单方法是将指针封装在一个“智能”的类似指针的对象中,该对象拥有指针,并能在析构时自动删除指针所指向的对象。因为这个智能指针可以简单的看作是一个自动对象(也就是说,它在超出作用域的时候会被自动销毁),所以很自然的称之为“智能”指针:
/例1(b):安全代码,使用auto _ ptr
/
void f()。
} // Cool:当pt超出作用域时,调用析构函数,
/从而自动删除对象
现在代码不会泄漏T类型的对象,不管这个函数是正常退出还是抛出异常,因为pt的析构函数在出栈时总会被调用。清洗将自动完成。
最后,使用auto_ptr就像使用内置指针一样简单,而如果我们想“撤销”资源并再次采用手动所有权,只需要调用release():
//例2:使用auto _ ptr
/
void。
//现在,我们有了一个赋值对象
/并且所有权传递给了一个auto_ptr对象
auto _ ptr pt2(pt1);
//使用auto_ptr就像我们以前使用简单指针一样
* pt2 = 12;//比如“* pt1 = 12”
pt2-> some func();//比如“pt1-> some func();”
//用get ()
assert( pt1 == pt2.get())获取指针的值;
//使用release()撤销所有权
T * pt3 = pt2 . release();
//自己删除这个对象,因为现在
//没有auto_ptr拥有这个对象
删除pt3
} // pt2已经没有任何指针了,所以不要
/尝试删除它...好了,不要重复删除了
最后,我们可以使用auto_ptr的reset()函数来重置auto_ptr,以拥有另一个对象。如果这个auto_ptr已经拥有了一个对象,那么它会先删除已经拥有的对象,所以调用reset()就好比销毁这个auto_ptr,然后创建一个新的,拥有一个新的对象:
//例3:使用reset()
/
void h()
pt . reset(new T(2));
//删除“new T(1)”赋值的第一个T
}//最后pt超出范围,
//第二个T也删除。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++技巧(标准auto

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情