zoukankan      html  css  js  c++  java
  • std::unique_ptr release的使用

    在c++中,动态内存管理是通过new/delete 运算符来进行的。由于确保在正确的时间释放内存是很困难的,为了避免内存泄漏,更加容易,安全地使用动态内存,C++11标准库提供了两种智能指针类型来管理动态对象。只能指针的行为类似于常规指针,重要的区别是它负责自动释放所指的对象。

    std::shared_ptr ,  允许多个指针指向同一个对象

    std::unique_ptr, 独占所指向的对象

    std::unique_ptr 是 c++11中用来取代 std::auto_ptr 指针的指针容器。 它不能与其他unique_ptr类型的指针对象共享所指对象的内存。这种所有权仅能够通过std::move函数来转移。unique_ptr是一个删除了拷贝构造函数、保留了移动构造函数的指针封装类型。

    调用release 会切断unique_ptr 和它原来管理的对象的联系。release 返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。如果不用另一个智能指针来保存release返回的指针,程序就要负责资源的释放。

    #include <iostream>
    #include <memory>
    
    int main() {
    
            std::unique_ptr<int> uptr(new int(10));  //绑定动态对象
            //std::unique_ptr<int> uptr2 = uptr;  //不能賦值
            //std::unique_ptr<int> uptr2(uptr);  //不能拷内
            std::unique_ptr<int> uptr2 = std::move(uptr); //轉換所有權
    
            if(uptr == nullptr)
                printf("uptr give up *int
    ");
    
    
            int * p = uptr2.release(); //uptr2释放对指针的控制权,返回指针,并将uptr2置为空
    
            if(uptr2 == nullptr)
              printf("uptr2 give up *int
    ");
    
    
            printf("%d
    ", *p);
            delete p;
    
            return 0;
    }

    输出结果:

    [daq@centos build]$ ./hello-exe/cmake-good 
    uptr give up *int
    uptr2 give up *int
    10

     

  • 相关阅读:
    Good Subarrays(思维)
    Just h-index(主席树裸题)
    强联通入门
    Fragrant numbers(dfs爆搜+区间dp+stoi)
    Mr. Panda and Kakin (RSA 解密+解同余方程+O(1)快速乘)
    Balance of the Force (枚举+线段树+二分图)
    2019 ICPC上海站K.Color Graph
    Wi Know (思维+线段树)
    Linux zookeeper 安装
    javaBIO
  • 原文地址:https://www.cnblogs.com/zengtx/p/11911853.html
Copyright © 2011-2022 走看看