C成也指针,败也指针。确实,指针给程序员提供了很多便利和灵活性,但是不当的指针使用也会造成很多问题。 为了带来指针更好的使用体验,C++中引入了智能指针的概念,其实质就是将指针的一些操作封装成类,程序员通过使用熟悉的指针运算符(-> 和 *)访问封装指针,该指针类通过运算符重载返回封装的原始指针。 C++11中主要有两种类型的智能指针: (1) shared_ptr代表的是“共享所有权”(shared ownership)的指针。 foreach是C++11的新特性,貌似Visual Studio2010中是不支持的,但是2013中是支持的: // print all elements for (vector<shared_ptr 智能指针的使用和普通指针类似,但是需要记住智能指针不能使用delete关键字显示释放空间。
上边的SmartPtr还不能将其称为智能指针,因为它还不具有指针的行为。 指针可以解引用,也可以通过->去访问所指空间中的内容,因此:AutoPtr模板类中还得需要将 、->重载下,才可让其像指针一样去使用*。 只声明不实现+声明成私有 UniquePtr(UniquePtr<T> const &); UniquePtr & operator=(UniquePtr<T> const &); // C++11 UniquePtr & operator=(UniquePtr<T> const &) = delete; private: T * _ptr; }; 3.5 std::shared_ptr C++11 需要注意的是shared_ptr的线程安全分为两方面: 智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时++或–,这个操作不是原子的,引用计数原来是1,++了两次,可能还是
return _ptr[pos]; } private: T* _ptr; }; unique_ptr 头文件是《memory》 unique_ptr的使用 unique_ptr是C++11 C++98的方式是将拷贝构造函数和拷贝赋值函数声明为私有;C++11的方式就直接在这两个函数后面加上=delete,防止外部进行调用: template<class T> class unique_ptr weak_ptr weak_ptr的使用 weak_ptr是C++11中引入的智能指针,weak_ptr不是用来管理资源的释放的,它主要是用来解决shared_ptr的循环引用问题的。 与boost中智能指针的关系 C++11和boost中智能指针的关系 C++98中产生了第一个智能指针auto_ptr。 C++11,引入了boost中的unique_ptr、shared_ptr和weak_ptr。
智能指针家族包括auto_ptr(C++98)、unique_ptr、shared_ptr和weak_ptr(C++11)等类型。 • unique_ptr是C++11引入的智能指针,其名称意为"唯一指针"。特点是禁止拷贝操作(拷贝构造函数和赋值运算符被删除),仅支持移动语义(通过std::move转移所有权)。 这意味着必须显式构造智能指针 //shared_ptr<Date> sp5 = new Date(2024, 9, 11); //unique_ptr<Date> sp6 = new Date(2024 , 9, 11); 运行结果: 4. C++11和boost中智能指针的关系 • Boost库作为C++标准库的重要补充,是一个由全球C++开发者共同维护的开源项目。
导语: C++指针的内存管理相信是大部分C++入门程序员的梦魇,受到Boost的启发,C++11标准推出了智能指针,让我们从指针的内存管理中释放出来,几乎消灭所有new和delete。 ,可以用p1->get判空做保护 因此在C++11又推出了unique_ptr、shared_ptr、weak_ptr三种智能指针,慢慢取代auto_ptr。 真正的智能指针:shared_ptr auto_ptr和unique_ptr都有或多或少的缺陷,因此C++11还推出了shared_ptr,这也是目前工程内使用最多最广泛的智能指针,他使用引用计数(感觉有参考 多线程安全 本章所说的线程安全有两种情况: 多个线程操作多个不同的shared_ptr对象 C++11中声明了shared_ptr的计数操作具有原子性,不管是赋值导致计数增加还是释放导致计数减少,都是原子性的 多个线程操作同一个shared_ptr对象 同样的道理,既然C++11只负责sp_counted_base的原子性,那么shared_ptr本身就没有保证线程安全了,加入两个线程同时访问同一个shared_ptr
前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。 C++11智能指针介绍 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。 C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。 只有引用计数为0时,智能指针才会自动释放引用的内存资源。对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。 所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。 auto_ptr (C++98的方案,C++11已经抛弃)采用所有权模式。
智能指针的由来 在远古时代,C++发明了指针这把双刃剑,既可以让程序员精确地控制堆上每一块内存,也让程序更容易发生crash,大大增加了使用指针的技术门槛。 ,可以用p1->get判空做保护 因此在C++11又推出了unique_ptr、shared_ptr、weak_ptr三种智能指针,慢慢取代auto_ptr。 真正的智能指针:shared_ptr auto_ptr和unique_ptr都有或多或少的缺陷,因此C++11还推出了shared_ptr,这也是目前工程内使用最多最广泛的智能指针,他使用引用计数(感觉有参考 多线程安全 本章所说的线程安全有两种情况: 多个线程操作多个不同的shared_ptr对象 C++11中声明了shared_ptr的计数操作具有原子性,不管是赋值导致计数增加还是释放导致计数减少,都是原子性的 多个线程操作同一个shared_ptr对象 同样的道理,既然C++11只负责sp_counted_base的原子性,那么shared_ptr本身就没有保证线程安全了,加入两个线程同时访问同一个shared_ptr
什么是智能指针 简单地说,智能指针是用对象去管理一个资源指针,同时用一个计数器计算引用当前指针对象的个数,当管理指针的对象增加或减少时,计数器也相应加1或减1,当最后一个指针管理对象销毁时,计数器为1, 此时在销毁指针管理对象的同时,也对指针管理对象所管理的指针进行delete操作。 下面我们介绍两个常用的智能指针std::shared_ptr和std::weak_ptr。 与std::shared_ptr最大的差别是在赋值的时候,不会引起智能指针计数增加。 智能指针小结 可以看出,智能指针其实是std::shared_ptr和std::unique_ptr, std::shared_ptr可以有多个引用对象,但不能互相引用,而std::unique_ptr
为什么会有智能指针??? C++程序员在编写代码的过程往往都会涉及到堆内存的开辟和释放,使用new和delete关键字。 这无疑要求C++程序员对于对内存的使用要求之高,而智能指针的诞生解放了C++程序员对于堆内存的管理。 智能指针 智能指针是一个类,它将裸指针(带*的指针)进行了封装,实现的指针的自动释放,它的高明之处就在于程序员只需要一次性的设计出一个具有良好功能的智能指针类,用它实例化出来的对象会自动对对象内存的堆资源进行管理 使用智能指针的前提是利用了当栈对象的生存周期结束时,会自动调用析构函数,来进行对对象的销毁。RAII技术。智能指针不能再堆上创建。 设计智能指针的类模板 需要解决的问题: (1)指针可以做的事情,智能指针也必须可以做。需要对*,->运算符进行重载。 (2)*运算符需返回引用,因为*可以连续使用。
那我就接着做下一道题号,第11题号。 ? 什么是双指针,我仔细在脑海中回忆了下。哈哈,原谅我这么健忘。 ……(这是关于指针的解释) 哦原来如此。 想知道什么是双指针,待会文章结尾处会放出视频给你们欣赏下——坐标x轴下面的两个箭头就是双指针。 话不多说,我们就解决11题号(盛最多的水)吧。 ? 两种方法——暴力解决法和双指针法。 双指针法,按官方解释: 将指向较长线段的指针向内侧移动,矩形区域的面积将受限于较短的线段而不会获得任何增加。 但是,在同样的条件下,移动指向较短线段的指针尽管造成了矩形宽度的减小,但却可能会有助于面积的增大。因为移动较短线段的指针会得到一条相对较长的线段,这可以克服由宽度减小而引起的面积减小。 最后使用双指针法去解决的视频供出来,请欣赏!
C++11提供了智能指针,使用智能指针后不需要用户自己释放内存空间,一旦使用时对象超出了自己的生命周期,就会进行自动释放,从而有效解决了内存泄露的问题。 如果函数要返回this指针时,不要将this当做智能共享指针进行返回。因为如果使用同一个指针(this)构造了两个对象,析构时可能导致重复析构。 2 独占的智能指针:std::unique_ptr 独占智能指针使用时有限制,如:不允许其它智能指针共享其内部指针;不允许通过赋值将一个独占指针给另外一个独占指针。 如果想要将一个独占指针分配给另外一个独占指针,有两种方法,分别是: 通过函数返回值; 通过std::move方法转义指针对象的所有权. 代码如下所示: std::unique_ptr<T> p(new T); std::unique_ptr<T> p1 = std::move(p); 在C++ 11中,并没有提供make_unique
很多人谈到c++,说它特别难,可能有一部分就是因为c++的内存管理吧,不像java那样有虚拟机动态的管理内存,在程序运行过程中可能就会出现内存泄漏,然而这种问题其实都可以通过c++11引入的智能指针来解决 c++11引入了三种智能指针: std::shared_ptr std::weak_ptr std::unique_ptr shared_ptr shared_ptr使用了引用计数,每一个shared_ptr main() { auto ptr = std::unique_ptr(new A); auto tptr = std::make_unique(); // error, c++11 关于c++11的智能指针的使用就介绍到这里,大家有问题可以点此留言 ,我会尽快回复~ 参考资料 https://www.jianshu.com/p/b6ac02d406a0 https://juejin.im /post/5dcaa857e51d457f7675360b#heading-16 《深入应用c++11:代码优化与工程级应用》
正因为 std::auto_ptr 的设计存在如此重大缺陷,C++11 标准在充分借鉴和吸收了 boost 库中智能指针的设计思想,引入了三种类型的智能指针,即 std::unique_ptr、std: boost 还有 scoped_ptr,C++11 并没有全部照搬,而是选择了三个最实用的指针类型。 在 C++11 中可以通过 std::unique_ptr 达到与 boost::scoped_ptr 一样的效果。 令很多人对 C++11 规范不满的地方是,C++11 新增了 std::make_shared() 方法创建一个 std::shared_ptr 对象,却没有提供相应的 std::make_unique 当然,在 C++11 中你很容易实现出这样一个方法来: template<typename T, typename...
接雨水(双指针、单调栈) LeetCode 84. 柱状图中最大的矩形(单调递增栈) 两个指针 i, j 分别指向首尾,水的面积 s s = \left ( j-i \right )*min(hi,hj) s=(j−i)∗min(hi,hj) 如果哪边的 h 小,那边的指针向中间移动
我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以指向同一个动态对象,并维护了一个共享的引用计数器。 为了解决类似这样的问题,C++11引入了weak_ptr,来打破这种循环引用。 2、weak_ptr是什么? weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针,它指向一个由 shared_ptr 管理的对象而不影响所指对象的生命周期,也就是将一个 weak_ptr 绑定到一个 shared_ptr 从这个角度看,weak_ptr更像是shared_ptr的一个助手而不是智能指针。 3、weak_ptr如何使用? 接下来,我们来看看weak_ptr的简单用法。
模拟实现】 【哈希表】 【unordered_set/unordered_map 使用介绍】 【unordered_set/unordered_map 模拟实现】 /------------ C++11 (变为悬空指针),新指针接管资源 这种设计极易引发逻辑错误(悬空指针访问、重复释放),因此 C++11 后已被彻底弃用 使用示例: auto_ptr<int> p1(new int(10)); auto_ptr 2. unique_ptr:unique_ptr<T>& operator=(unique_ptr<T>&& sp) */ }; shared_ptr 一、基本介绍 shared_ptr(C++11 类型解析:std::function<void(T*)> std::function:是 C++11 引入的 通用函数包装器,可以存储、复制和调用任何可调用对象(函数指针、函数对象、lambda 表达式等 shared_ptr 用堆上的引用计数实现共享管理 weak_ptr 一、基本介绍 weak_ptr(C++11 引入,弱引用辅助) weak_ptr:是为辅助 shared_ptr 解决循环引用问题设计的弱引用智能指针
模拟实现】 【哈希表】 【unordered_set/unordered_map 使用介绍】 【unordered_set/unordered_map 模拟实现】 /------------ C++11 注意:C++11后已被弃用,不推荐使用,存在潜在风险 */ auto_ptr<Date> ap2(ap1); /* * 1. ,管理一个Date对象 unique_ptr<Date> up1(new Date); /* 说明:unique_ptr(C++11 推荐,独占所有权) * 1. 创建shared_ptr智能指针,管理一个Date对象 shared_ptr<Date> sp1(new Date); /* 说明:shared_ptr(C++11 推荐,共享所有权 :资源指针 + 控制块指针) 6.
指针 指针作为C语言的核心部分,相比较其他的内容相对比较难懂一下,应用的方式多样,变化较多,导致很多的同学非常苦恼,那么接下来,我将陪你来共同揭开指针的神秘面纱; 指针的含义 大家不要把指针想的太难,指针其实就是通过地址找到对应的变量的位置 ,然后我们可以对地址进行解引用来访问变量的内存,来获取值的一种间接方法;我们通常说指针指向哪里哪里,就是指针变量里面存的其他变量(或者常量)的地址;即 指针->地址->内存; 普通变量指针 首先,我们现来看看指针的构成以及表达形式 ; 数组指针 数值指针,其主体是指针,他就是个指针,不过是有点不同而已,这个指针指向的是数组的地址,在此之前我们需要了解数组的地址; 数组的地址; 我们通常说数组的地址是数组名,是数组的首元素地址,也确实是这样 字符指针 含义 字符指针就是指针指向了字符或者字符串,因为字符串可以看成是一个字符数组,所以字符串指针与数组指针大致可以类比; 字符指针打印字符串 这里我使用了三种打印字符串的方式,从结果上看,很明显打出来的字符串都是相同的 指针数组 含义 指针数组,主体是数组,不同的是里面存的是指针,是地址; 指针数组打印二维数组 值得注意的是指针数组的[]前面的*p是没有括号的,我们可以这样看,他是一个数组,数组名是p,数组元素个数是3
文章目录 1 暴力(超时) 2 双指针(双指针+两边中高度最低的指针靠近) 1 暴力(超时) class Solution { public: int maxArea(vector<int maxarea) maxarea = maxCoArea; } return maxarea; } }; 2 双指针 (双指针+两边中高度最低的指针靠近) class Solution { public: int maxArea(vector<int>& height) { int maxarea height[left], height[right]); if (coarea > maxarea) maxarea = coarea; // 两边中高度最低的指针靠近
自C++11开始,好多C++程序员慢慢的感受到了C++的魅力所在,似乎难度也越来越小。 C++ 11.png 本文要讲的是C++11引入的智能指针之std::unique_ptr。 std::unique_ptr系C++11引入的智能指针,拥有资源的唯一所有权,头文件 #include <memory>。 unique_ptr指针指向的堆内存空间的引用计数为 1,如果unique_ptr 指针放弃对所指堆内存空间的所有权,那么该空间会被立即释放回收。 那么,什么时候使用unique_ptr呢? >(12345)); std::unique_ptr<int> sp1(std::move(sp)); std::move将sp持有的堆内存转移给sp1后,sp不再持有堆内存的引用,变成一个空的智能指针对象 return 0; } 容器内保存指针示例: std::vector<std::unique_ptr<int>> vec; std::unique_ptr<int> sp(std::make_unique