zoukankan      html  css  js  c++  java
  • 使用auto_ptr需要注意的事项

    注:C++11 已不推荐使用,应使用scoped_ptr/shared_ptr. 部分原因就是如下的注意事项。

    转自:http://patmusing.blog.163.com/blog/static/13583496020101824541270/

    a. auto_ptr定义于头文件memory中;

    b. auto_ptr只能用来管理单个动态创建的对象,而不能管理动态创建的数组;

    c. 和其他copy和assign不同,auto_ptr的copy和assign会改变右边的操作数,assignment符号的两边的auto_ptr均为左值;There is a crucially important difference between how auto_ptr and built-in pointers treat copy and assignment. When we copy an auto_ptr or assign its value to another auto_ptr, ownership of the underlying object is transferred from the original to the copy. The original auto_ptr is reset to an unbound state;

    d. auto_ptr不能作为容器中的元素;

    auto_ptr的copy和assign具有析构行为,这就是auto_ptr不能作为容器元素的原因,因为标准库中的容器有对元素的要求:经

    过copy或者assign后的两个对象,必须相等;

    e. 在判断一个auto_ptr是否被绑定的时候,不能直接使用auto_ptr对象:

    auto_ptr<Student> stu1(new Student);

    if(stu1)

    {

    cout << "stu1 is bound" << endl;

    }

    else

    {

    cout << "stu1 is unbound" << endl;

    }

    这样做将会导致compile error,应该改为:

    auto_ptr<Student> stu1(new Student);

    if(stu1.get()) // get()获取的是underlying对象的指针,如果被绑定则非零,如果没有被绑定则为0

    {

    cout << "stu1 is bound" << endl;

    }

    else

    {

    cout << "stu1 is unbound" << endl;

    }

    f. auto_ptr的构造函数是explicit的,消除了隐式的类型转换(在这里即,从指针类型到auto_ptr类型的转换),因此不能直接将一个

    指针赋给一个auto_ptr对象。如下面这样的代码:

    auto_ptr<Student> stu5 = new Student;

    stu5->printStudentInfo();

    在编译的时候不会有问题,但会出现严重的runtime error。正确的做法应该是:

    auto_ptr<Student> stu5(new Student);

    stu5->printStudentInfo();

    g. 不同用两个auto_ptr绑定到同一个对象。

    // stu6和stu7绑定到了同一个对象,这将会导致该对象被析构两次,将会产生runtime error

    auto_ptr<Student> stu6(new Student("Evanligine", "F", 8));

    auto_ptr<Student> stu7(stu6.get());

    后面一句,应该改为:

    auto_ptr<Student> stu7(stu6);

    这样stu6就将ownership转交给了stu7,stu6则成为了unbound的auto_ptr。

    h. 不能用auto_ptr指向静态资源分配对象。如下面的代码,尽管可以通过编译,但将会产生runtime error:

    int ix = 10;

    auto_ptr<int> pint1(&ix);

    i. auto_ptr的重要操作

    auto_ptr<T> ap; 创建一个未绑定的auto_ptr对象ap

    auto_ptr<T> ap(p); 创建一个auto_ptr对象ap,它绑定了指针p所指向的对象。该构造函数是explicit的

    auto_ptr<T> ap1(ap2); 创建一个auto_ptr对象ap1,它绑定到原来被ap2绑定的对象,ap2则成为未绑定的auto_ptr

    ap1 = ap2; ap1删除原来绑定的对象,ap2将ownership移交给ap1,ap2成为未绑定的auto_ptr

    *ap 返回ap绑定的对象的引用。可以通过*给被绑定的内在对象赋值。如下面代码:

    auto_ptr<int> pint(new int(3));

    cout << *pint << endl; // 输出3

    *pint = 100;

    cout << *pint << endl; // 输出100

    ap-> 返回被ap绑定的对象的指针

    ap.reset(p) 如果指针p和ap绑定的内存对象的指针不相同,那么ap删除被其绑定的内存对象,改而绑定p所

    指向的对象.

    ap.release() 返回ap所绑定对象的指针,并使ap成为未绑定对象

    ap.get() 返回ap所绑定对象的指针

  • 相关阅读:
    Nginx创建密码保护目录
    Android:Field can be converted to a local varible.
    创建用户故事地图(User Story Mapping)的8个步骤
    用户故事地图(User Story Mapping)之初体验
    Android必知必会--GreenDao缓存
    Windows下多线程数据同步互斥的有关知识
    OpenCV3.0 3.1版本的改进
    利用OpenCV的人脸检测给头像带上圣诞帽
    一些关于并行计算的科研思路
    Java中httpClient中三种超时设置
  • 原文地址:https://www.cnblogs.com/qinfengxiaoyue/p/3417775.html
Copyright © 2011-2022 走看看