scoped_ptr

  • 拷贝构造和 =赋值操作均为私有,不允许
  • 内部重载了解引用(*)操作符和 ->操作符,操作与普通指针无异

用例

     //拷贝构造和赋值操作均为私有    利用模板
scoped_ptr<string> p(new string("hello world"));//初始化一个指向string的指针
cout << *p << '\n' << p->size() << '\n';//用法与普通指针一致
assert(p);//用于判断指针是否为空
p.reset();//指针重置
//p++;//错误 智能指针只有* 和 ->操作符

unique_ptr

  • 与scoped_ptr极为相似
//与scoped极为相似
void testUnique() {
//Unique基本功能与scope相同
unique_ptr<int> p(new int);
int *a = new int(123);
assert(p);//测试指针是否有效;
p.reset(a); //利用指针,使得指针重新指向一个新的对象(类型必须与初始化时相同)
*p = 100;
Show<int>(*p);
p.reset();//置空
//工厂函数
//比使用new更为安全,且效率不低
p = std::make_unique<int>(10);
//p = boost::make_unique<int>(10); /scoped_ptr没有这个函数,因为拷贝构造私有
Show(*p);
}

shared_ptr

  • 可以拷贝,可以赋值(=)

案例

void testShared() {
boost::shared_ptr<int> p(new int);
*p = 100;
boost::shared_ptr<int> p1(p);
cout << "引用是否唯一:" << p.unique() << endl;//是否唯一,1为真,0为假
p1.reset();//重置p1
cout << "(reset后)引用是否唯一:" << p.unique() << endl;//是否唯一,1为真,0为假
//p1.reset(new int); boost::shared_ptr<vector<int>> sp = boost::make_shared<vector<int>>(10, 2);//初始化添加10个2
//boost::shared_ptr<int[]>sps=boost::make_shared<int[]>(10);大小为10的数组
(*sp).push_back(10);
sp->push_back(20);
for (int &x: *sp) {
cout << x << '\t';
}
}

智能指针简单应用

void myfclose(ifstream *ifs) {
cout << "文件关闭\n";
ifs->close();
} ifstream *myfopen(const char *path) {
cout << path << "打开\n";
return new ifstream(path, ios::in);
} void testShared1() {
//ifstream *fs = myfopen("./bridge.cpp");
//巧用删除器,当智能指针销毁时会调用myfclose函数
boost::shared_ptr<ifstream> fp(myfopen("/home/lhh/boost_1_77_0/LICENSE_1_0.txt"), myfclose);
char buf;
while ((buf = fp->get()) != EOF) {
cout << buf;
} }

上述案例运用了shared_ptr的包含了删除器的构造函数

    template<class Y, class D>
shared_ptr( Y * p, D d ): px( p ), pn( p, static_cast< D&& >( d ) )
{
boost::detail::sp_deleter_construct( this, p );
}
//D可以是个函数对象或者函数指针,只要能是的D(...)合法就没问题,离开作用域时,函数会调用D

智能指针简单应用

//使用智能指针指向数组
unique_ptr<char[]> p= make_unique<char[]>(50);
  • 通常我们都是使用unique_ptr管理数组,因为在C++17之前,shared_ptr还无法正确的释放数组资源,需要自己定义删除器,并且unique_ptr重载了下标运算符[],并且可以正确释放数组资源

最新文章

  1. [deviceone开发]-心形点赞动画示例
  2. Java:单例模式的七种写法
  3. CocoaPods安装和使用
  4. JQ对象到底是什么
  5. Windows Server 2012中配置AD域服务
  6. 和我一起学python,控制语句 (life is short ,we need python)
  7. iOS源码之OC相册,可以循环查看图片
  8. 【Todo】网络编程学习-面向工资编程
  9. ASP.NET 4.0 Webform Bundles 压缩css, js,为什么放到服务器不行
  10. 关于mysql下hibernate实体类字段与数据库关键字冲突的问题
  11. 实例化的两种方法(new和函数法)
  12. [C#网络编程系列]专题一:网络协议简介
  13. [NOIP2005]采药
  14. ASP.NET MVC轻教程 Step By Step 5——初识表单
  15. 常见ORACLE错误,及解决方案(遇则即时更新)
  16. Eclipse插件管理
  17. javascript (十) 变量
  18. C#算法
  19. WCF博文链接
  20. Qt之实现网络下发配置的半透明友好提示界面

热门文章

  1. C# 中的那些锁,在内核态都是怎么保证同步的?
  2. 安装MySQL8 工具集
  3. 记录一次Bitbucket鉴权的坑
  4. Android EGL 实践
  5. GMOJ5673 爬山法 题解
  6. 八、指定节点pod运行在固定节点
  7. curl 下载地址中有特殊字符解决方案
  8. xss学习笔记(萌新版)
  9. java反序列化_link_six
  10. 初步探索GraalVM——云原生时代JVM黑科技