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

    /* 智能指针shared_ptr注意点 */
    
    #include <iostream>
    #include <string>
    #include <memory>           //智能指针头文件
    
    /*
    注意点一:shared_ptr并非线程安全
    
    注意点二:weak_ptr一起使用时, weak_ptr 在使用前需要检查合法性
    
    注意点三:shared_ptr 不支持数组, 如果使用数组, 需要自定义删除器, 如下是一个利用 lambda 实现的删除器:
    
    */
    
    // shared_ptr定制的删除器仿函数
    template<class T>//注意这里有模版 
    struct DelArray
    {
        void operator()(const T* ptr)
        {
            delete[] ptr;
            ptr = NULL;
        }
    };
    
    void test()
    {
        std::weak_ptr<int> wp;
        {
            std::shared_ptr<int>  sp(new int);  //sp.use_count()==1
            wp = sp; //wp不会改变引用计数,所以sp.use_count()==1
            std::shared_ptr<int> sp2 = wp.lock(); //wp没有重载->操作符。只能这样取所指向的对象
        }
        printf("expired:%d
    ", wp.expired()); // 判断wp是否已经失效
        std::shared_ptr<int> sp_null = wp.lock(); //sp_null .use_count()==0;
    
        /*
            上述代码中 sp 和 sp2 离开了作用域, 其容纳的对象已经被释放了. 得到了一个容纳 NULL 指针的 sp_null 对象.
        在使用 wp 前需要调用 wp.expired() 函数判断一下. 因为 wp 还仍旧存在, 虽然引用计数等于0,仍有某处“全局”性的存储块保存着这个计数信息.
        直到最后一个 weak_ptr 对象被析构, 这块“堆”存储块才能被回收, 否则 weak_ptr 无法知道自己所容纳的那个指针资源的当前状态.
        */
    
        //shared_ptr 不支持数组
        std::shared_ptr<int> sps(new int[10], DelArray<int>());
    
        for (size_t i = 0; i < 5; i++)
        {
            *((int*)sps.get() + i) = 10 - i;
        }
    
        for (size_t i = 0; i < 5; i++)
        {
            printf("%d -- %d
    ", i, *((int*)sps.get() + i));
        }
    }
    
    int main()
    {
        test();
        getchar();
        return 0;
    }
  • 相关阅读:
    AtCoder Regular Contest 086 E
    bzoj3192: [JLOI2013]删除物品(树状数组)
    bzoj5118: Fib数列2(费马小定理+矩阵快速幂)
    bzoj2314: 士兵的放置(树形DP)
    bzoj1907: 树的路径覆盖(树形DP)
    最小割 总结&&做题记录
    最大流 总结&&做题记录
    网络流24题之太空飞行计划
    网络流24题之负载平衡问题
    网络流24题之飞行员配对方案
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/10294488.html
Copyright © 2011-2022 走看看