• std::unique_ptr用法


    copy from : https://blog.csdn.net/piaopiaopiaopiaopiao/article/details/87912137

    1. #include <iostream>
    2.  
      #include <memory>
    3.  
       
    4.  
      struct Task {
    5.  
      int mId;
    6.  
      Task(int id) : mId(id) {
    7.  
      std::cout << "Task::Constructor" << std::endl;
    8.  
      }
    9.  
      ~Task() {
    10.  
      std::cout << "Task::Destructor" << std::endl;
    11.  
      }
    12.  
      };
    13.  
       
    14.  
      int main() {
    15.  
      //空unique_ptr对象
    16.  
      std::unique_ptr<int> ptr1;
    17.  
       
    18.  
      //检查unique_ptr对象是否为空
    19.  
      if (!ptr1) {
    20.  
      std::cout << "ptr1 is empty" << std::endl;
    21.  
      }
    22.  
       
    23.  
      //检查unique_ptr对象是否为空
    24.  
      if (ptr1 == nullptr) {
    25.  
      std::cout << "ptr1 is empty" << std::endl;
    26.  
      }
    27.  
       
    28.  
      //不能通过赋值初始化创建unique_ptr对象
    29.  
      //std::unique_ptr<Task> taskPtr2 = new Task(); //编译错误
    30.  
       
    31.  
      //通过原始指针创建unique_ptr对象
    32.  
      std::unique_ptr<Task> taskPtr(new Task(23));
    33.  
       
    34.  
      //检查taskPtr是否为空,或者是否有关联的原始指针
    35.  
      if (taskPtr != nullptr) {
    36.  
      std::cout << "taskPtr is not empty" << std::endl;
    37.  
      }
    38.  
       
    39.  
      //通过unique_ptr访问内部元素
    40.  
      std::cout << taskPtr->mId << std::endl;
    41.  
       
    42.  
      std::cout << "Reset the taskPtr" << std::endl;
    43.  
      //重置unique_ptr将删除关联的原始指针,并使unique_ptr对象为空
    44.  
      taskPtr.reset();
    45.  
       
    46.  
      //检查taskPtr是否为空,或者是否有关联的原始指针
    47.  
      if (taskPtr == nullptr) {
    48.  
      std::cout << "taskPtr is empty" << std::endl;
    49.  
      }
    50.  
       
    51.  
      //通过原始指针创建unique_ptr对象
    52.  
      std::unique_ptr<Task> taskPtr2(new Task(55));
    53.  
       
    54.  
      if (taskPtr2 != nullptr) {
    55.  
      std::cout << "taskPtr2 is not empty" << std::endl;
    56.  
      }
    57.  
       
    58.  
      //unique_ptr 对象不可复制
    59.  
      //taskPtr = taskPtr2; //编译错误
    60.  
       
    61.  
      //unique_ptr 对象不可复制
    62.  
      //std::unique_ptr<Task> taskPtr3 = taskPtr2; //编译错误
    63.  
       
    64.  
      {
    65.  
      //转移所有权
    66.  
      std::unique_ptr<Task> taskPtr4 = std::move(taskPtr2);
    67.  
       
    68.  
      if (taskPtr2 == nullptr) {
    69.  
      std::cout << "taskPtr2 is empty" << std::endl;
    70.  
      }
    71.  
       
    72.  
      //taskPtr2的所有权转移给了task4
    73.  
      if (taskPtr4 != nullptr) {
    74.  
      std::cout << "taskPtr4 is not empty" << std::endl;
    75.  
      }
    76.  
       
    77.  
      std::cout << taskPtr4->mId << std::endl;
    78.  
      //taskPtr4超出范围并删除关联的原始指针
    79.  
      }
    80.  
       
    81.  
      //通过原始指针创建unique_ptr对象
    82.  
      std::unique_ptr<Task>taskPtr5(new Task(55));
    83.  
       
    84.  
      if (taskPtr5 != nullptr) {
    85.  
      std::cout << "taskPtr5 is not empty" << std::endl;
    86.  
      }
    87.  
       
    88.  
      //从原始指针释放对象的所有权
    89.  
      Task* ptr = taskPtr5.release();
    90.  
       
    91.  
      if (taskPtr5 == nullptr) {
    92.  
      std::cout << "taskPtr5 is empty" << std::endl;
    93.  
      }
    94.  
       
    95.  
      std::cout << ptr->mId << std::endl;
    96.  
       
    97.  
      delete ptr;
    98.  
       
    99.  
      return 0;
    100.  
      }
    101.  
    Always Believe Something Beauitful Will Be Happen
  • 相关阅读:
    PE感染学习
    寻找复活节彩蛋egg huting 学习
    unicode exp学习
    zlib的安装与使用
    PDF 学习
    MW6MaxiCode ACX溢出
    Blog 迁移啦
    Malloc Maleficarum复盘
    [winafl]这几天的折腾
    [pwnable.kr]--alloca
  • 原文地址:https://www.cnblogs.com/Oude/p/12446726.html
Copyright © 2020-2023  润新知