shared_ptr

来源:互联网 发布:淘宝照片木刻画 编辑:程序博客网 时间:2024/06/01 20:50

智能指针(模板类)
shared_ptr

  • 默认初始化的指针包含一个空指针(nullptr CP48),可以用new返回的指针来初始化智能指针。接收指针参数的智能指针的构造函数是explict,所以必须使用直接初始化的形式。CP412
shared_ptr<int> p1(new int(1024));p.reset(q);//p会从q中接管对象的所有权,当p是唯一指向原本对象的指针时,释放对象。
  • 当某个函数的参数列表需要智能指针的形参,先以独立语句的形式将newd对象存储于智能指针内,再送入该函数。由于编译器核算被传入参数列表的实参的顺序并不确定,如果在参数列表内进行动态分配,核算实参时发生异常可能会造成内存泄漏
    E17

  • 最好使用make_shared函数进行内存分配

auto p=make_shared<对象类型>(初始化的值);
  • 允许多个指针指向同一对象。每个shared_ptr都有reference count(引用计数)用于统计指向动态分配对象的指针个数。在不使用智能指针后记得删除指针。
    +1:初始化;参数传递;函数返回值
    -1:赋新值;指针被销毁
    引用计数为0时自动销毁对象

  • 即使函数发生异常(在资源分配时或者在分配和释放之间)后退出,智能指针被销毁时会递减引用计数,如果为0能够正常释放内存,但是普通指针在此情况下不会释放内存。CP415

  • 当shared_ptr指向1个没有析构函数的类型,通过deleter(删除器)函数来代替delete操作。CP416

//connection类型没有没有析构函数,该删除器函数接受connection *的指针void end_connection(connection *p){ diconnect(*p); }//创建智能指针时传递一个删除器函数connection c;shared_ptr<connection> p(&c,end_connection);
  • get函数只用于当需要向不能使用智能指针的函数传递一个内置指针(显示转换)。CP414 E15
p.get();//返回智能指针p中保存的指针             
原创粉丝点击