zoukankan      html  css  js  c++  java
  • C++里面普通指针怎么转换成智能指针

     1 #include <iostream>
     2 #include <memory>
     3 
     4 using namespace std;
     5 
     6 class T
     7 {
     8 public:
     9     T()
    10     {
    11         std::cout << "T()" << std::endl;
    12     }
    13     
    14     ~T()
    15     {
    16         std::cout << "~T()" << std::endl;
    17     }
    18 };
    19 
    20 int main()
    21 {
    22     {
    23         T *t1 = new T();
    24     }
    25     
    26     {
    27         T *t2 = new T();
    28         std::shared_ptr<T> t3(t2);
    29     }
    30     
    31     return 0;
    32 }

    运行结果:

     

     第28行就是将普通指针转换成了智能指针,出了作用域之后也成功析构了。

     一个普通指针智能转化一次智能指针,之后的操作要在智能指针上进行。

    代码:

     1 #include <iostream>
     2 #include <memory>
     3 
     4 using namespace std;
     5 
     6 class T
     7 {
     8 public:
     9     T()
    10     {
    11         std::cout << "T()" << std::endl;
    12     }
    13     
    14     ~T()
    15     {
    16         std::cout << "~T()" << std::endl;
    17     }
    18     
    19 private:
    20     int t[1024];
    21 };
    22 
    23 int main()
    24 {
    25     {
    26         T *t1 = new T();
    27     }
    28     
    29     {
    30         T *t2 = new T();
    31         std::shared_ptr<T> t3(t2);
    32         
    33         std::shared_ptr<T> t4(t2);
    34         
    35     }
    36     
    37     return 0;
    38 }

    类里面定义了一个数组,用于析构释放堆空间时复现问题,否则不容易复现。

    运行结果:

     31、33行会导致析构两次,产生了内存错误。

  • 相关阅读:
    IO流
    泛型类
    自动打包&解包:auto-boxing&unboxing
    Map接口
    如何选择数据结构
    Compareable接口
    List常用算法
    equals和==
    List接口
    set接口
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13551318.html
Copyright © 2011-2022 走看看