智能指针

shared_ptr

  • 接受指针参数的构造函数是explicit的,因此不能将内置指针隐式转换为一个智能指针.
  • 默认情况下,智能指针必须指向动态内存,为了绑定到其他类型的资源的指针上,必须提供自己的delete操作.
    • shared_ptr p(q, d): p将使用可调用对象d来代替delete.
  • 不要混用普通指针和智能指针
    • shared_ptr可以协调对象的析构,这仅限于自身的拷贝.因此尽量使用make_shared,这样可以防止无意间将同一块内存绑定到多个shared_ptr之上.
  • 不要使用get初始化另一个智能指针或为智能指针赋值
    • get是为了以下情况设计的:需要向不能使用智能指针的代码传递一个内置指针,使用get返回的指针的代码不能delete.
  • reset经常与unique一起使用,来控制多个shared_ptr的共享对象.在改变底层对象之前,使用unique检查我们是否是唯一的所有者,如果不是则制作一份拷贝
    • example code:
      if(!p.unique())
      p.reset(new string(*p))
      *p += newVal;
      
  • 智能指针和异常
    • 函数正常结束或发生了异常,局部对象都会被销毁.
  • 智能指针和哑类
    • example code:
      void f()
      {
      connection c = connect();
      shared_ptr p(&c, end_connection);
      }
      

unique_ptr

  • unique_ptr不支持拷贝和赋值
  • 可以通过调用release或reset将指针的所有权从一个(非const)unique_ptr转移给另一个unique_ptr.
    • 如果我们不用另一个智能指针来管理release返回的指针,则需要手工delete
  • 向unique_ptr传递删除器
    • unique_ptr管理删除器的方式和shared_ptr不同

weak_ptr

  • weak_ptr必须使用lock
    • example code:
    if(share_ptr p = wp.lock()) {
    
    }
    

动态数组

  • 动态分配一个空数组是合法的
    • 此指针保证与任何new返回的指针都不相同,可以做为尾后迭代器.
  • 释放
    • delete [] pa;
  • 智能指针和动态数组
    unique_ptr p(new int[10]);
    up.release();
    
  • 与unique_ptr不同,shared_ptr不支持管理动态数组,如果希望使用shared_ptr管理动态数组,必须提供自己定义的删除器
    • 如果未提供删除器行为是未定义的,因为shared_ptr默认使用delete删除对象

allocator类

将内存分配和对象构造分离

  • allocator类帮助我们将内存分配和对象构造分离开来

  • 在早期版本的标准库中,construct只授受两个参数:创建对象的位置和一个类型值,因此只支持拷贝构造.

43.6K

发表评论

邮箱地址不会被公开。 必填项已用*标注