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

    一.简介

    C++ 中动态内存的管理是通过 new 和 delete 来配对使用。但是我们可能存在忘记释放内存的情况,为了更好的托管动态内存,C++11 提供了两种智能指针类型来管理动态对象

    shared_ptr 允许多个指针指向同一个对象,weak_ptr 类指向 shared_ptr 所管理的对象 

    unique_ptr 独占所指向的对象

    都定义在 memory 头文件中

    shared_ptr<T> p         //空智能指针,可以指向类型为T的对象
    unique_ptr<T> p 
    p                       //将p用作一个条件判断,若p指向一个对象,则为true
    *p                      //解引用p获得它指向的对象
    p->get()                //返回p中保存的指针
    swap(p, q)              //交换p q中的指针
    p.swap(q)

    Shared_ptr<T> p(q)
    Shared_ptr<T> p(q, d)
    Shared_ptr<T> p(p2, d)
    p.reset()
    p.reset(q)
    p.reset(q, d)

     

    二.Shared_ptr

    shared_ptr 最初实现于 Boost 库中,最后被 C++ 标准委员会收录于 C++11 中

    shared_ptr是一种智能指针,作用如同指针,但会用引用计数记录不同的shared_ptr指向同一个对象,一旦对象的引用计数变为0,对象就会自动删除

    1.初始化

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      //默认初始化的智能指针保存着一个空指针
      shared_ptr<string> p1;
      if(!p1)
        cout<<"p1==NULL"<<endl;
    
      //初始化
      shared_ptr<string> p2(new string);
      if(p2 && p2->empty()){
        *p2 = "helloword"
        cout<< *p2 <<endl;
      }
    
      //一般的初始化方式
      shared_ptr<string> print(new string("normal usage!"));
      cout<<*print<<endl;
    
      //推荐安全的初始化方式
      shared_ptr<string> print1 = make_shared<string>("safe uage!")
      cout<< *pint1 <<endl;
    
    }
    // 错误初始化方式
    shared_ptr<int> pa = new int(1);
    
    int* p = new int(32);
    shared_ptr<int> pp(p);
    cout<< *pp << endl;
    
    delete p;
    cout<< *pp <<endl;

    2.get()

    get()返回一个内置指针,指向智能指针的管理对象

    #include <iostream>
    #include <memory>
    using namespace std;
    
    void useShared_ptr(int* p)
    {
      cout<< *p <<endl;
    }
    
    void delePointer(int* p)
    {
      delete p;
    }
    
    int main(int argc, char* argv[])
    {
      shared_ptr<int> p1 = make_shared<int> (32);
      // shared_ptr<int> p2(p1.get())  错误,他们各自有内存的引用计数,不能拷贝过去
    
      useShared_ptr(p1.get());
      // delePointer(p1.get())  错误
    
      return 0;
    
    }

    3.make_shared<>()

    安全分配和使用动态内存的方法是调用 make_shared() 标准库函数,此函数在动态内存中分配一个对象并初始化它,返回此对象的shared_ptr

    #include <iostream>
    using namespace std;
    
    int main()
    {
      shared_ptr<int> p3 = make_shared<int>(42);
      cout<< *p3 <<endl;
    
      shared_ptr<string> pstr = make_shared<string>("99999");
      cout<< *pstr <<endl;
    
      shared_ptr<int> pint = make_shared<int>();
      cout<< *pint <<endl;
    
      auto pau = make_shared<string>("auto");
      cout<< *pau <<endl;
     
    }

    4.shared_ptr的拷贝和赋值

     

    5.引用计数

  • 相关阅读:
    如何在eclipse+pydev运行scrapy项目
    QT下发布APP 文件(Mac)
    QT调用python脚本
    Python-Mac 安装 PyQt4-转
    <转载>在Sublime Text 2/3 中使用Git插件连接GitHub
    python+Eclipse+pydev环境搭建
    [codeforces1270G]Subset with Zero Sum 数学 建图
    [计算机网络]学习笔记
    [ubuntu] VMware Tools 安装详细过程与使用 ——主机和ubuntu虚拟机之间的文本和文件传递
    [codeforces1221D] Make The Fence Great Again dp
  • 原文地址:https://www.cnblogs.com/k5bg/p/11474759.html
Copyright © 2011-2022 走看看