您的位置:首页 > 其它

关于智能指针 auto_ptr

2010-06-07 11:02 381 查看
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
*********************************/

#include <iostream>
#include <memory>

using namespace std;
class Point{
public:
Point(double x, double y):m_x(x),m_y(y){}
~Point(){
cout<<"destructor!/n";
}

void SetXY(double x, double y){
m_x = x;
m_y = y;
}

double GetX(){
return m_x;
}
double GetY(){
return m_y;
}
void display(){
cout<<m_x<<"/t"<<m_y<<endl;
}
private:
double m_x;
double m_y;
};
int main()
{
auto_ptr<Point> pstr;

Point * point = new Point(10,10);
pstr.reset(point);
pstr->display();
pstr->SetXY(10,20);
pstr->display();

Point * p = new Point(2,2);
pstr.reset(p);
pstr->display();
}


运行结果如下:

10      10
10      20
destructor!
2       2
destructor!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: