c++ 智能指针

所需要的头文件 #include <memory>

  • shared_ptr : 允许多个指针指向同一个对象;
  • unique_ptr : 独占 所指向的对象
  • weak_ptr : 弱引用

shared_ptr独有的操作

  • make_shared函数 : 最安全的分配和使用动态内存的方法
  shared_ptr<int> p3 = make_shared<int>(42);
  cout<<*(p3.get())<<endl; //42
  shared_ptr<string> p4 = make_shared<string>(10,‘9‘);
  cout<<*(p4.get())<<endl; // 10个9
  auto p5 = make_shared<int>(); // p5 指向一个初始化的int,初始值为0
  auto p6 = make_shared<vector<string>>(); //p6 指向一个动态分配的空vector<string>
  // 拷贝和赋值
  auto p = make_shared<int>(42);
  auto q(p);
  cout<<*(q.get())<<endl; // 42
  auto r = make_shared<int>(43);
  r = q; // r所指向的对象的引用计数器递减,没有了引用者,会自动释放
  cout<<*(r.get())<<endl; // 42 

shared_ptr和new结合使用

    shared_ptr<double> p1; 
    /*  
     *shared_ptr<T> p(q)
     * p管理内置指针q所指向的对象
     * q必须指向new分配的内存,且能够转换为T*类型
     */
    shared_ptr<int> p2(new int(42)); 
    // p2 = new int(42); 错误 不能将一个指针赋值给shared_ptr
    /*  
     *p2.reset() 若p2是唯一指向其对象的shared_ptr,reset会释放此对象
     * reset 成员经常与 unique 一起使用,来控制多个shared_ptr 共享的对象,
     * 在改变底层对象之前,我们检查自己是否是当前对象仅有的用户,如果不是,
     * 在改变之前要制作一份新的拷贝
     */
    p2.reset(new int(1024)); // p2指向一个新的对象
    cout<<*(p2.get())<<endl;
    if(!p2.unique())
    {   
        p2.reset(new int(*p2)); // 我们不是唯一用户;分配新的拷贝;
    }   
    *p2 += 22; // 现在我们知道自己是唯一的用户,可以改变对象的值
    cout<<*p2<<endl; // 1046

c++ 智能指针

上一篇:测试项目报java.lang.NullPointerException


下一篇:R语言数据处理60题