关于智能指针 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
*********************************/
运行结果如下:
在函数中通常要获得一些资源,执行完动作后,然后释放所获得的资源,当程序员忘记释放所申请的到的资源,或者由于异常发生而没有正常释放资源时,这就将产生一系列的内存泄漏问题。
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!
相关文章推荐
- 关于C++智能指针的理解auto_ptr
- 关于智能指针auto_ptr
- C++标准库---智能指针auto_ptr初探
- STL+auto_ptr智能指针简单分析
- auto_ptr指针介绍(智能指针)
- C++ auto_ptr智能指针的用法
- 【C++】智能指针 auto_ptr
- 智能指针auto_ptr
- C++智能指针(auto_ptr)详解
- stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结
- C++易混知识点4: 自己编写一个智能指针(Reference Counting)学习auto_ptr和reference counting
- auto_ptr 智能指针要点
- 智能指针 std::auto_ptr 和 shared_ptr
- C++ - 智能指针 Vs. auto_ptr
- 自己动手实现智能指针auto_ptr
- c++中的智能指针auto_ptr
- 智能指针auto_ptr
- 剖析智能指针之auto_ptr
- 智能指针auto_ptr
- 智能指针(auto_ptr 和 shared_ptr)