zoukankan      html  css  js  c++  java
  • C++ 智能指针七

    /* 智能指针weak_ptr */
    
    #include <iostream>
    #include <string>
    #include <memory>
    
    /*
        weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 
    进行该对象的内存管理的是那个强引用的 shared_ptr. weak_ptr只是提供了对管理对象的一个访问手段.
        weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 
    它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少.
        weak_ptr 定义在 memory 文件中(非memory.h), 命名空间为 std.
    
    weak_ptr 初始化:
    方式一:构造函数构造
    std::shared_ptr<int> sp(new Student);
    std::weak_ptr<int> wp(sp);
    
    方式二:赋值初始化
    std::shared_ptr<int> sp(new int(10));
    wp = sp;
    
    方式三:通过weak_ptr 对象构造
    
    */
    
    /*
    成员函数
    weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象. 注意, weak_ptr 在使用前需要检查合法性.
    expired 用于检测所管理的对象是否已经释放, 如果已经释放, 返回 true; 否则返回 false.
    lock 用于获取所管理的对象的强引用(shared_ptr). 如果 expired 为 true, 返回一个空的 shared_ptr; 否则返回一个 shared_ptr,
        其内部对象指向与 weak_ptr 相同.
    use_count 返回与 shared_ptr 共享的对象的引用计数.
    reset 将 weak_ptr 置空.
    weak_ptr 支持拷贝或赋值, 但不会影响对应的 shared_ptr 内部对象的计数.
    */
    
    struct Student
    {
    public:
        Student(std::string name_, int age_) :name(name_), age(age_) {}
        std::string name;
        int age;
    };
    
    void test()
    {
        //初始化方式一
        std::shared_ptr<Student> sp1(new Student("tom",11));
        std::weak_ptr<Student> wp1(sp1);
    
        //初始化方式二
        std::weak_ptr<Student> wp2 = sp1;
    
        //初始化方式三
        std::weak_ptr<Student> wp3 = wp2;
    
        //weak_ptr 在使用前需要检查合法性
        if (!wp3.expired())
        {
            //weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象
            std::shared_ptr<Student> tmp = wp3.lock();
            printf("name is [%s] .
    ", tmp->name.c_str());
        }
    
        std::weak_ptr<Student> wp4;
        {
            std::shared_ptr<Student> sp2(new Student("jack",10));
            wp4 = sp2;
            printf("%d
    ", wp4.use_count()); // 1
            wp4.reset();
            printf("%d
    ", wp4.use_count()); // 0
            printf("%d
    ", sp2.use_count()); // 1
            //weak_ptr不会影响引用记数的增加或减少
        }
        //当weak_ptr引用对象被析构之后,lock(0方法返回值为NULL
        std::shared_ptr<Student> spnull = wp4.lock();
        if (NULL == spnull)
        {
            printf("shared_ptr is not Usable .
    ");
        }
    }
    
    int main()
    {
        test();
        getchar();
        return 0;
    }
  • 相关阅读:
    设置datagrid的背影及对单元格进行设置
    利用结果集更新记录
    安装sql2000提示"以前的某个程序安装已在安装计算机上创建挂起的文件操作"解决办法
    xls.exe
    动态增加datagrid的行数
    Emergency Preparedness Resource Inventory(紧急预备资源列表系统)
    DataList中选择列的实现与数据的取得:
    Android中发送Http请求实例(包括文件上传、servlet接收)
    android文件上传到服务器
    C++获取程序执行时间
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/10294517.html
Copyright © 2011-2022 走看看