1、设计动机:
在函数中通常要获得一些资源,执行完动作后,然后释放所获得的资源,当程序员忘记释放所申请的到的资源,或者由于异常发生而没有正常释放资源时,这就将产生一系列的内存泄漏问题。
2、主要函数
(1) reset 函数
重设需要管理的指针,首先 auto_ptr 会删除当前管理的对象,然后再设置新的对象的指针。
Point *p1 = new Point(1.0,2.0);
Point *p2 = new Point(2.0,3.0);
auto_ptr<Point>pstr;
pstr.reset(p1);
pstr.reset(p2); // 删除 p1 对象,然后将 pstr 指向 p2
(2) release 函数
释放所有权,返回它管理的指针,不删除指针指向的对象:
auto_ptr<Point> pstr(p1.release()); // 等同于下句
auto_ptr<Point> pstr(p2); // 等同于上句
3、注意事项
(1) auto_ptr不能指向数组。
(2) auto_ptr不能作为容器的成员。
(3) 由于auto_ptr 的构造函数被定义为了explicit,故不能通过赋值操作来初始化 auto_ptr
auto_ptr<Point> pstr(new Point(1.0,2.0)); //OK
auto_ptr<Point> pstr = new Point(1.0,2.0); //ERROR
(4) 如果被管理的类的析构函数为私有的,那么将无法使用 auto_ptr。
(5) 尽量不要在参数中使用auto_ptr指针,也不要通过引用传递auto_ptr。
4、示例代码
/********************************
作者: zgl_dm
日期; 2010-06-07
描述: 智能指针 auto_ptr 实例
blog: http://blog.csdn.net/zgl_dm
*********************************/
运行结果如下: