例如在 17 以前需要 shared_ptr sp(new T[3], [](T* p){ delete[] p; });,否则 sp 析构时会默认用 delete p,而不是 delete[] p,导致问题...因此,public 继承 std::enale_shared_from_this 就可以解决这个问题,使用return shared_from_this();就可以返回一个和前面已经存在的 shared_ptr...memory_order_relaxed. decrementing requires stronger ordering to safely destroy the control block 不要把一个原生指针给多个...shared_ptr 管理 不要把 this 指针给 shared_ptr 解决方法: 用 shared_from_this 当心循环引用。...在函数实参列表中使用时的问题:fun(shared_ptr(new T), g); 有可能先 new T,再调用 g(),而一旦 g() 异常,则 new T 的内存泄露。
为什么需要智能指针? 下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题。...但是如果碰上异常时,就算注意释放了,还是可能会出问题。需要下一条智 能指针来管理才有保证。 2. 采用RAII思想或者智能指针来管理资源。 3. 有些公司内部规范使用内部实现的私有内存管理库。...出问题了使用内存泄漏工具检测。ps:不过很多工具都不够靠谱,或者收费昂贵。 总结一下: 内存泄漏非常常见,解决方案分为两种:1、事前预防型。如智能指针等。2、事后查错型。如泄 漏检测工具。...) 这样就发生了循环引用,没法正常释放空间,屏蔽其中一个就没问题,但两个都有就不行了 解决方法(weak_ptr不是智能指针) / 解决方案:在引用计数的场景下,把节点中的_prev和_next改成weak_ptr...智能指针是在C++98版本中已经存在的 B.auto_ptr的多个对象之间,不能共享资源 C.auto_ptr的实现原理是资源的转移 3: C++11中提供的智能指针都只能管理单个对象的资源,没有提供管理一段空间资源的智能指针
RAII 在了解智能指针之前,我们需要先要了解RAII,那么什么是RAII呢?...智能指针 上边的SmartPtr类,就是RAII,但是只有管理资源释放的功能,并没有指针解引用和->的操作,不能对管理的资源进行控制,那么我们如何让SmartPtr支持像指针一样的行为呢?...这里我们将引入智能指针的概念,并且简要的模拟四种库的智能指针,理解原理 智能指针的原理如下: RAII特性 重载operator * 和opertaor->,具有像指针一样的行为。...循环引用 问题的引入:我们有个节点类,用shared_ptr会发生什么样的问题,我们来看一下下面 上边说share_ptr的对象不能给Node*,我们可以更改一个Node类,将前后指针改成智能指针。...定制删除器 定制删除器是针对智能指针管理的类型定制专用的删除器,如果没有制删除器可能会出现一些错误。
,是会报错的,因为这会造成一个浅拷贝的问题(等以后再详细解释 那么为了解决浅拷贝的问题,我们用不带引用计数的智能指针和带引用计数的智能指针来解决 不带引用计数的智能指针 不带引用计数的:是只能一个指针管理资源...这样做会调用该对象的析构函数来清理它所占用的资源,然后释放为它分配的内存 shared_ptr的交叉引用问题 shared_ptr:强智能指针,可以改变资源的引用计数 weak_ptr:弱智能指针,不会改变资源的引用计数...(交叉引用)的问题 上面的这份代码,咱们自己写的CSmartPtr也是强智能指针,因为可以改变引用计数 看下面这份代码,use_count()是获得引用计数是多少 #include...= nullptr) { ps->testA(); } } 多线程访问共享对象的线程安全问题 接下来讲讲强弱智能指针的应用 比如C++著名开源网络库muduo库 这涉及到多线程访问共享对象的线程安全问题...建议使用智能指针来管理对象的生命周期,以避免这种问题 所以咱们得再调用testA的时候,看看A对象是否还活着,这时候就用到了强弱指针 那就在handler传入一个weak_ptr pw,如果A对象不存在
为什么引入智能指针? 内存泄漏问题 C++在堆上申请内存后,需要手动对内存进行释放。随着代码日趋复杂和协作者的增多,很难保证内存都被正确释放,因此很容易导致内存泄漏。...return 0; } 多线程下的对象析构问题 在多线程环境下,对象的析构问题需要特别注意,因为多个线程可能同时访问和操作同一个对象。如果多个线程同时尝试析构同一个对象,可能会导致对象被多次删除。...智能指针的使用 下面是一个原始指针和智能指针比较的示例代码 // 原始指针 void rawptr(){ // 使用原始指针 Obj *rawptr = new Obj("raw pointer...智能指针的特点包括: 拥有权管理:智能指针拥有其所指向的对象,负责在适当的时机释放内存。这意味着当智能指针超出作用域或不再需要时,它会自动调用析构函数来释放内存。...智能指针封装了指向堆分配对象的原始指针,因此智能指针通常提供直接访问其原始指针的方法。 C++ 标准库智能指针拥有一个用于此目的的get成员函数。
用过Java的同学从来不会关心对象的释放问题,但是C/C++里面有一个Java里面没有的概念:指针。指针其实就是内存地址。...智能指针其实就是帮我们管理这种内存空间,自动做到:不用了就释放掉。这里面有一个问题:它如何知道我们不用了?智能指针的解决方案是维护一个计数器。...Android的指针指针比上面说的强大,它分为几种:轻量级智能指针、强智能指针、弱智能指针。...强智能指针和弱智能指针: Android中分别为强智能指针和弱智能指针维护了一个计数器。通常我们通过强智能指针使用对象,而弱智能指针对需要提升为强智能指针后才可以使用。...ok,上面就是Android智能指针原理,具体使用方式参考老罗的例子就可以上手。 下面说一处在阅读源码时遇到的一个问题:在维护计数器时,通过android_atomic_add进行原子操作: ?
智能指针 智能指针虽然也号称指针,但是它是一个复杂的家伙:通过比引用更复杂的数据结构,包含比引用更多的信息,例如元数据,当前长度,最大可用长度等。...智能指针往往是基于结构体实现,它与我们自定义的结构体最大的区别在于它实现了 Deref 和 Drop 特征: Deref 可以让智能指针像引用那样工作,这样你就可以写出同时支持智能指针和引用的代码,例如...,这两个特征可以智能地帮助我们节省使用上的负担:Deref 可以让智能指针像引用那样工作,这样你就可以写出同时支持智能指针和引用的代码,例如 *T。...考虑一下智能指针,*它是一个结构体类型,如果你直接对它进行 myStruct,显然编译器不知道该如何办,因此我们可以为智能指针结构体实现 Deref 特征。...接着,我们又使用 Rc::clone 克隆了一份智能指针 Rc,并将该智能指针的引用计数增加到 2。
或者使用智能指针来完成,包含shared_ptr和unique_ptr两种,前者允许多个指针指向同一个对象(每个shared_ptr都有一个引用计数来计算指向对象的指针个数),而后者则只能由一个指针指向一个对象...shared_ptr 智能指针也是模板的一种,所以创建时需要指出类型,,也支持和指针一样的解引用操作。...所以使用make_shared创建比较好,可以避免这种问题。 p.get()操作 p.get()的设计目的是当需要向不能用智能指针的地方传递一个内置指针时使用。...p.get()的作用是返回一个内置指针,指向智能指针指向的对象,并且返回的指针不能被delete 有几个注意点: 返回的指针不能被delete,因为如果delete就会销毁对象,那么之后智能指针就无法释放已经被释放的对象...auto p=make_shared(1); auto a=p.get() delete a; 返回的指针不能用于初始化另一个智能指针,这样会会有两个独立的智能指针指向同一个对象,并且引用计数都是
智能指针:托管new出来的对象的释放 #include using namespace std; class person { public: person() { cout <...void show() { cout << "年龄为:"<<18 << endl; } ~person() { cout << "析构函数的调用" << endl; } }; //智能指针...} private: person* p; }; void test() { /*person* p=new person; p->show();*/ /*delete p;*/ //智能指针
也就是说, 所谓“引用的引用”的存在价值,只是为std::move、std::forward等而服务的, 小思考: 引用就是指针,二级指针 二级引用 可以等价理解吗?...:明确自己想解决什么问题 使用场景是什么?...结论是什么 带着问题去学习智能指针 问题是什么?...明确 不同平台怎么实现 这里讨论不是智能指针是如何实现和设计的,讨论是如何使用的 make_unique从这里开始 //提问1. unique_ptr能不能相互赋值, //提问2. unique_ptr...make_unique 创造 和智能指针关系不太大 白银(初级)理解: MSVC 11.0 (Visual Studio 2012)实现 https://github.com/watchpoints/microsoft_STL
C++智能指针 什么是智能指针 来看这段代码: #include using namespace std; int div() { int a, b; cin >> a >...return 0; } 通过调试看到,本来应该只想同一处空间的指针因为深浅拷贝析构两次的问题,让第一个原本指向该位置的指针变了方向,直接不管了原本的地址。...kw=weak_ptr 这个智能指针就是为了解决这个问题而诞生的。...C++ 98 中产生了第一个智能指针auto_ptr。...并且这些智能指针的实现原理是参考boost中的实现的。
什么是智能指针 智能指针是C++中的一个概念,通过基于引用计数的方法,解决对象的自动释放的问题。...在Android的源代码中,经常会看到形如:sp、wp这样的类型定义,这其实是Android中的智能指针。...程序员往往需要花费很大精力进行精心设计,以避免这些问题的出现。...Android智能指针实现的源码路径: frameworks/rs/cpp/util/StrongPointer.h frameworks/rs/cpp/util/RefBase.h 强指针sp(strong...pointer) 强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个 对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。
什么是智能指针? 今天之前我对这个概念也很陌生,但是接触之后我便很喜欢这种指针了。 与其说是指针,不如说是一种基于指针的模板类。 智能指针存在的意义?...有关智能指针的注意事项: List item 首先,我们把auto_ptr摈弃掉。 因为它比较老,允许多个指针指向同一个变量。 那么回收的时候就会出现一个问题:一个变量被回收了多次。...shared_ptr通过技术手段解决了这个析构的问题,unique_ptr则不允许将多个指针指向一个变量,它会在编译的时候直接报错。...List item 不要将 *this指针交给智能指针。...这应该也是比较关心的问题吧。 指针的作用域结束时它就自己清理了。至于如果有人非要手动去释放,那我个人建议你用普通指针。
3、当需要在类的内部接口中,如果需要将this作为智能指针来使用的话,需要用该类派生自enable_shared_from_this。...关于这点自己实现一个智能指针就知道了。 一个shared_ptr在空间上至少是三个裸指针的大小(24个字节),本身有引用还要配合weak_ptr使用所以要保存多少该指针的引用。...); assert(obj == nullptr); // shared_ptr weak_ptr enable_shared_from_this // unique_ptr } ---- 6、智能指针只能表示所有权...也很好举例,用智能指针写个二叉树试试。 好了就说到这儿吧,再说多了怕是以后都不敢用了。...今天之所以要写这么一篇,是最近看智能指针的好处被吹的天花乱坠的让我都有点想把以前裸指针的代码全改成智能指针了。 但是呢,不要忘了我们开头的那句话哦。
用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。...你可能会想,如此多的智能指针就为了解决new、delete匹配问题,真的有必要吗?看完这篇文章后,我想你心里自然会有答案。 下面就按照顺序讲解如上 7 种智能指针(smart_ptr)。...所有智能指针都重载了“operator->”操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用“.”操作符。 访问智能指针包含的裸指针则可以用 get() 函数。...智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。...由于 std::auto_ptr 引发了诸多问题,一些设计并不是非常符合 C++ 编程思想,所以引发了下面 boost 的智能指针,boost 智能指针可以解决如上问题。 让我们继续向下看。
问题 什么是智能指针?什么时候用它们? 回答 从较浅的层面看,智能指针其实是利用了 RAII(资源获取即初始化)技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针。...我们首先想到指针,在 accept 内部 new 生成一个对象,然后返回指针。 但是问题更多。这个对象何时析构? 过早析构,程序发生错误;不进行析构,又造成了内存泄露。...这里的解决方案就是智能指针,而且是引用计数型的智能指针。...对于特定的对象,只能有一个智能指针可拥有,这样只有拥有对象的智能指针的构造函数会删除该对象。然后让赋值操作转让所有权。...创建智能更高的指针,跟踪引用特定对象的智能指针数,这称为引用计数。例如,赋值时,计数将加 1,而指针过期时,计数将减 1,。当减为 0 时才调用 delete。
为什么需要智能指针?...这种做 法有两大好处: 不需要显式地释放资源 对象所需的资源在其生命期内始终保持有效 RAII是一种思想,智能指针是这种思想的产物 智能指针的常见问题 1.使用对象的生命周期去控制资源 创建一个私有的成员变量...拷贝问题 因为没有在类中实现拷贝构造,默认是浅拷贝 ,所以就会导致释放两次,从而报错 深拷贝是不可以的,因为指针拷贝要的就是浅拷贝 链表等迭代器 结构与智能指针类似,用的是浅拷贝,为什么没有问题?...---- 使用智能指针就进行释放了 ---- n1和n2作为智能指针对象,而next和prev作为原生指针 智能指针对象是没办法给原生指针的 ---- 将next和prev都转化为智能指针即可...解决问题 但是节点不释放了 节点使用原生指针可以释放,而使用智能指针不能释放,这样的问题被称为循环引用 ---- n1与n2都是智能指针,分别去管理资源 n2对应的引用计数为1,将n1的_next指向
不会自动释放指针的指针。 3.除非自己知道后果,不要把auto_ptr 智能指针赋值给同类型的另外一个智能指针,解释如下。...auto_ptr主要问题如下: 复制和赋值会改变资源的所有权,不符合人的直觉。...release返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。在本例中,管理内存的责任简单地从一个指针转给了另一个。...weak_ptr 为了解决shared_ptr交叉循环引用无法释放的问题。...禁止用任何类型智能指针get 函数返回的指针去初始化另外一个智能指针!
为了更好的管理我们申请的空间,C++引入了智能指针。 参考文章: 1.【C++】异常_ 2. ...在封装了几层的函数中抛异常,我们也能够来通过智能指针来管理好空间。 2.智能指针的完善 上述的 SmartPtr 还不能将其称为智能指针,因为它还不具有指针的行为。...但是我们发现,智能指针没有提供拷贝的功能,那么接下来我们看看库中实现的智能指针是如何做的?...---- 三、标准库中的智能指针 1.std::auto_ptr 参考文献:std::auto_ptr auto_ptr 是C++库中的第一个智能指针,其在面对拷贝构造的解决办法是:转移所有权(当用当前的智能指针对象拷贝出一个新对象时...所以在我们对智能指针中的资源操作的时候,我们也需要手动加锁。 C)shared_ptr中的循环引用问题 虽然shared_ptr相较于以往的智能指针,表现的十分好,但是仍旧是有缺陷的。
目录 1.为什么需要智能指针 2.内存泄漏问题 3.智能指针的使用以及原理 ---- 1.为什么需要智能指针?...但是如果碰上异常时,就算注意释放了,还是可能会出问题。需要下一条智能指针来管理才有保证。 ②采用RAII思想或者智能指针来管理资源。 ③有些公司内部规范使用内部实现的私有内存管理库。...但是这会导致一个问题,会导致原本的智能指针对象悬空!即我拷贝或赋值之后,还要用怎么办?因此,auto_ptr是一个失败设计,很多公司明确要求不能使用auto_ptr。...为了解决这个问题,就可以使用定制删除器。 在使用shared_ptr智能指针的时候,除了传入类型,我们还可以传入定制删除器。...于是就会造成以下问题: 计数引用: ①node1和node2两个智能指针对象指向两个节点,引用计数变成1,我们不需要手动delete。
领取专属 10元无门槛券
手把手带您无忧上云