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行会导致析构两次,产生了内存错误。

  • 相关阅读:
    自定义序列化类注意事项
    HashMap中的modCount
    transient
    30张图带你彻底理解红黑树(转)
    hashcode和hash算法
    线程池
    VS2015 NuGet错误:远程证书无效
    解决前台JS弹框Alert点击确定页面会刷新
    Regex中Replace方法的简单实用
    .ashx 一般处理程序
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13551318.html
Copyright © 2011-2022 走看看