stl pair头文件_c++ strlen头文件

stl pair头文件_c++ strlen头文件C++:共享指针shared_ptr的理解与应用一 为什么要使用shared_ptr?在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:有些内存资源已经被释放,但指向它的指针并没有改变指向

C++:共享指针shared_ptr的理解与应用   一 为什么要使用shared_ptr?   在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。智能指针shared_ptr 是存储动态创建对象的指针,其主要功能是管理动态创建对象的销毁,从而帮助彻底消除内存泄漏和悬空指针的问题。   二 shared_ptr的原理和特点   基本原理:就是记录对象被引用的次数,当引用次数为 0 的时候,也就是最后一个指向该对象的共享指针析构的时候,共享指针的析构函数就把指向的内存区域释放掉。   特点:它所指向的资源具有共享性,即多个shared_ptr可以指向同一份资源,并在内部使用引用计数机制来实现这一点。   共享指针内存:每个 shared_ptr 对象在内部指向两个内存位置:指向对象的指针;用于控制引用计数数据的指针。   1.当新的 shared_ptr 对象与指针关联时,则在其构造函数中,将与此指针关联的引用计数增加1。   2.当任何 shared_ptr 对象超出作用域时,则在其析构函数中,它将关联指针的引用计数减1。如果引用计数变为0,则表示没有其他 shared_ptr 对象与此内存关联,在这种情况下,它使用delete函数删除该内存。   shared_ptr像普通指针一样使用,可以将*和->与 shared_ptr 对象一起使用,也可以像其他 shared_ptr 对象一样进行比较;   三 shared_ptr的使用   3.1.构造函数创建   3.2.make_shared辅助函数创建   建议使用make_shared的方式构造   3.3 自定义所指堆内存的释放规则   在初始化 shared_ptr 智能指针时,还可以自定义所指堆内存的释放规则,这样当堆内存的引用计数为 0 时,会优先调用我们自定义的释放规则。   在某些场景中,自定义释放规则是很有必要的。比如,对于申请的动态数组来说,shared_ptr 指针默认的释放规则是不支持释放数组的,只能自定义对应的释放规则,才能正确地释放申请的堆内存。   对于申请的动态数组,释放规则可以   使用 C++11 标准中提供的 default_delete 模板类   可以自定义释放规则   四 shared_ptr常用函数   get()函数,表示返回当前存储的指针(就是被shared_ptr所管理的指针) 。但是不建议使用get()函数 shared_ptr 关联的原始指针,因为如果在 shared_ptr 析构之前手动调用了delete函数,会导致错误   use_count()函数,表示当前引用计数   reset()函数,表示重置当前存储的指针   operator*,表示返回对存储指针指向的对象的引用。它相当于:* get()。operator->,表示返回指向存储指针所指向的对象的指针,以便访问其中一个成员。跟get函数一样的效果。   示例1:shared_ptr的基础应用:   示例2:shared_ptr作返回值   示例3:容器中的shared_ptr-记得用erease节省内存   对于一块内存,shared_ptr类保证只要有任何shared_ptr对象引用它,他就不会被释放掉。由于这个特性,保证shared_ptr在不用之后不再保留就非常重要了,通常这个过程能够自动执行而不需要人工干预,有一种例外就是我们将shared_ptr放在了容器中。所以永远不要忘记erease不用的shared_ptr。   示例4:shared_ptr:对象共享相同状态使用shared_ptr在一个常见的原因是允许多个多个对象共享相同的状态,而非多个对象独立的拷贝!   示例5:shared_ptr管理动态数组   默认情况下,shared_ptr指向的动态的内存是使用delete来删除的。这和我们手动去调用delete然后调用对象内部的析构函数是一样的。与unique_ptr不同,shared_ptr不直接管理动态数组。如果希望使用shared_ptr管理一个动态数组,必须提供自定义的删除器来替代delete 。   五 注意   5.1.常见错误(注意以下代码全是错误代码)   1.不能使用原始指针初始化多个shared_ptr。   2.不允许以暴露裸漏的指针进行赋值   隐式调用它构造函数   3.不要用栈中的指针构造 shared_ptr 对象   shared_ptr 默认的构造函数中使用的是delete来删除关联的指针,所以构造的时候也必须使用new出来的堆空间的指针。当 shared_ptr 对象超出作用域调用析构函数delete 指针&x时会出错。   4.不要使用shared_ptr的get()初始化另一个shared_ptr   5. 多线程中使用 shared_ptr   shared_ptr的引用计数本身是安全且无锁的,但对象的读写则不是,因为shared_ptr 有两个数据成员,读写操作不能原子化。shared_ptr 的线程安全级别和内建类型、标准库容器、std::string 一样,即:一个 shared_ptr 对象实体可被多个线程同时读取两个 shared_ptr 对象实体可以被两个线程同时写入,“析构”算写操作如果要从多个线程读写同一个 shared_ptr 对象,那么需要加锁

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/86196.html

(0)
上一篇 2024年 7月 26日
下一篇 2024年 7月 26日

相关推荐

关注微信