首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

智能指针

RAII 在了解智能指针之前,我们需要先要了解RAII,那么什么是RAII呢?...智能指针 上边的SmartPtr类,就是RAII,但是只有管理资源释放的功能,并没有指针解引用和->的操作,不能对管理的资源进行控制,那么我们如何让SmartPtr支持像指针一样的行为呢?...这里我们将引入智能指针的概念,并且简要的模拟四种库的智能指针,理解原理 智能指针的原理如下: RAII特性 重载operator * 和opertaor->,具有像指针一样的行为。...循环引用 问题的引入:我们有个节点类,用shared_ptr会发生什么样的问题,我们来看一下下面 上边说share_ptr的对象不能给Node*,我们可以更改一个Node类,将前后指针改成智能指针。...定制删除器 定制删除器是针对智能指针管理的类型定制专用的删除器,如果没有制删除器可能会出现一些错误。

33620
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    智能指针(一)

    或者使用智能指针来完成,包含shared_ptr和unique_ptr两种,前者允许多个指针指向同一个对象(每个shared_ptr都有一个引用计数来计算指向对象的指针个数),而后者则只能由一个指针指向一个对象...shared_ptr 智能指针也是模板的一种,所以创建时需要指出类型,,也支持和指针一样的解引用操作。...p.get()操作 p.get()的设计目的是当需要向不能用智能指针的地方传递一个内置指针时使用。...p.get()的作用是返回一个内置指针,指向智能指针指向的对象,并且返回的指针不能被delete 有几个注意点: 返回的指针不能被delete,因为如果delete就会销毁对象,那么之后智能指针就无法释放已经被释放的对象...auto p=make_shared(1); auto a=p.get() delete a; 返回的指针不能用于初始化另一个智能指针,这样会会有两个独立的智能指针指向同一个对象,并且引用计数都是

    85110

    rust智能指针

    智能指针 智能指针虽然也号称指针,但是它是一个复杂的家伙:通过比引用更复杂的数据结构,包含比引用更多的信息,例如元数据,当前长度,最大可用长度等。...智能指针往往是基于结构体实现,它与我们自定义的结构体最大的区别在于它实现了 Deref 和 Drop 特征: Deref 可以让智能指针像引用那样工作,这样你就可以写出同时支持智能指针和引用的代码,例如...,这两个特征可以智能地帮助我们节省使用上的负担:Deref 可以让智能指针像引用那样工作,这样你就可以写出同时支持智能指针和引用的代码,例如 *T。...考虑一下智能指针,*它是一个结构体类型,如果你直接对它进行 myStruct,显然编译器不知道该如何办,因此我们可以为智能指针结构体实现 Deref 特征。...接着,我们又使用 Rc::clone 克隆了一份智能指针 Rc,并将该智能指针的引用计数增加到 2。

    1.1K30

    Android智能指针

    网上已经有很多分析智能指针的文章了,讲得不错的是:Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析。本文尽量从不分析代码的角度,将Android中的智能指针原理讲述清楚。...Android的指针指针比上面说的强大,它分为几种:轻量级智能指针、强智能指针、弱智能指针。...轻量级智能指针: 其实就是最简单最常规的智能指针:构造器中增加计数器,析构器中减少计数器,当计数器为0,释放对象。...强智能指针和弱智能指针: Android中分别为强智能指针和弱智能指针维护了一个计数器。通常我们通过强智能指针使用对象,而弱智能指针对需要提升为强智能指针后才可以使用。...当以弱计数器为参考时:强计数器为0,对象不被释放,假如弱计数器不为0,你还可以通过弱智能指针提升为强智能指针,然后正常使用。当最后弱智能指针为0,对象被释放。

    61340

    智能指针详解

    智能指针设计的初衷就是可以帮助我们管理堆上申请的内存,即开发者只需要申请,释放内存的任务交给智能指针。用于确保程序不存在内存和资源泄漏且是异常安全的。...智能指针的使用 下面是一个原始指针智能指针比较的示例代码 // 原始指针 void rawptr(){ // 使用原始指针 Obj *rawptr = new Obj("raw pointer...智能指针的特点包括: 拥有权管理:智能指针拥有其所指向的对象,负责在适当的时机释放内存。这意味着当智能指针超出作用域或不再需要时,它会自动调用析构函数来释放内存。...异常安全性:智能指针在异常情况下能够保证资源的正确释放。即使发生异常,智能指针也会在其作用域结束时被销毁,并调用析构函数来释放资源。...智能指针封装了指向堆分配对象的原始指针,因此智能指针通常提供直接访问其原始指针的方法。 C++ 标准库智能指针拥有一个用于此目的的get成员函数。

    28540

    智能指针探究

    实现简易智能指针 #include using namespace std; // 智能指针 保证能做到资源的自动释放 // 智能指针实际利用栈上的对象出作用域自动析构的特征,来做到资源的自动释放...,是会报错的,因为这会造成一个浅拷贝的问题(等以后再详细解释 那么为了解决浅拷贝的问题,我们用不带引用计数的智能指针和带引用计数的智能指针来解决 不带引用计数的智能指针 不带引用计数的:是只能一个指针管理资源...这样做会调用该对象的析构函数来清理它所占用的资源,然后释放为它分配的内存 shared_ptr的交叉引用问题 shared_ptr:强智能指针,可以改变资源的引用计数 weak_ptr:弱智能指针,不会改变资源的引用计数...定义对象的时候,用强智能指针;引用对象的时候,使用弱智能指针 把上面代码改成这样的 // 这是定义对象 shared_ptr pa(new A()); shared_ptr pb(new B...比如我用智能指针托管数组的话,那delete就不行,得用delete[] 再比如我让它管理的不是内存资源,而是文件资源,那释放文件也绝对不可能用delete释放的 所以在我们除了智能指针在堆内存外,怎么正确指导智能指针来正确删除呢

    7810

    C++智能指针

    2.智能指针的基本思想 智能指针的基本思想是以栈对象管理资源[2]^{[2]}。...通俗来讲, 智能指针就是模拟指针动作的类。所有的智能指针都会重载->和*操作符。智能指针的主要作用就是用栈智能指针离开作用域自动销毁时调用析构函数来释放资源。...智能指针有时需要将其管理的对象的所有权转移给其它的智能指针,使得多个智能指针管理同一个对象,比如C++ STL中的shared_ptr支持多个智能指针管理同一个对象。...这个时候智能指针就需要知道其引用的对象总共有多少个智能指针在引用在它,也就是说智能指针所管理的对象总共有多少个所有者,我们称之为引用计数(Reference Counting),因为智能指针在准备释放所引用的对象时...每次创建智能指针时,初始化智能指针并将引用计数置为1;当智能指针q赋值给另一个智能指针r时,即r=q,拷贝构造函数拷贝智能指针并增加q指向的对象的引用计数,递减r原来指向的对象的引用计数。

    3.5K30

    智能指针的讲解

    1.为什么要智能指针 首先我们分析一段代码: 1、如果p1这里new 抛异常会如何? 2、如果p2这里new 抛异常会如何? 3、如果div调用这里又会抛异常会如何?...需要下一条智能指针来管理才有保证。 采用RAII思想或者智能指针来管理资源。 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。 出问题了使用内存泄漏工具检测。...如智能指针等 2、事后查错型。如泄漏检测工具 3....我们前面提到的智能指针就是RAII的一种产物 它的思想大概就是: 在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。...其实上面的一段代码还不算是完整的智能指针,因为智能指针的原理决定了它的特殊性质: 1.

    10611

    android智能指针介绍

    本篇介绍 android中有三种智能指针,分别是轻量级指针,强指针,弱指针。轻量级指针实现简洁,效果类似于强指针,然后强指针和弱指针的实现比较复杂比较重一些。本篇就介绍下这三种指针的具体实现。...*new_id*/) { } private: mutable std::atomic mCount; }; 一个类只要继承LightRefBase,然后配合sp就可以使用智能指针的功能了...比如一个对象对应的多个智能指针在多个线程里面使用,这时候就需要某个机制可以保证计数的准确。具体的策略就在incStrong和decStong里面,可以看到主要是使用了原子操作,并指定了内存序。...接下来看下sp,一个类继承了LightRefBase后就拥有了智能指针计数机制,然后通过sp来操作指针才能实现智能管理内存的效果: template class sp { public...ALOGV("Freeing refs %p of old RefBase %p\n", this, impl->mBase); delete impl; // 弱应用为0了,删除析构智能指针本身

    98620

    【C++】————智能指针

    c++中用的最多的是下面三种智能指针 C++11中提供了三种智能指针,使用这些智能指针时需要引用头文件 std::shared_ptr:共享的智能指针 std::unique_ptr...:独占的智能指针 std::weak_ptr:弱引用的智能指针,它不共享指针,不能操作资源,是用来监视shared_ptr的。...二,共享的智能指针shared_ptr 首先了解一下基本概念,再看代码,会学的很快 1. shared_ptr的初始化 共享智能指针是指多个智能指针可以同时管理同一块有效的内存,共享智能指针shared_ptr...,通过操作智能指针和操作智能指针管理的内存效果是一样的,可以直接完成数据的读写。...指定删除器 当智能指针管理的内存对应的引用计数变为0的时候,这块内存就会被智能指针析构掉了。

    9110

    Android基础--智能指针

    智能指针分为3类为轻量级指针(Light Pointer)、强指针(Strong Pointer)和弱指针(Weak Pointer)。轻量级指针采用的是简单的计数,可以认为是强指针的简化版本。...解决指针问题 智能指针就是为了解决以上问题的,在了解Android 智能指针之前。先来分析下如何解决以上问题, 首先需要有一种能够自动释放的方法,而对于程序代码而言,只有栈内存才会自动去释放。...利用好这两点是实现智能指针的基础 智能指针是类 初步设计,智能指针是一个类,类有一个成员指针,能指向任意的object,所以是一个模板类 template class sp {...计数问题 智能指针如何判断对象的内存不在需要呢,在很多领域有引用计数的概念,及当没有指针指向该内存时,就可以认为该内存对象不需要了。...那么该如果计数呢,是否能由智能指针来计数? 明显是很难做到的,如下图,两个智能指针的内存空间是独立的,智能指针持有计数变量,各指针变量之间很难同步 ?

    1.6K20

    Android之智能指针

    什么是智能指针 智能指针是C++中的一个概念,通过基于引用计数的方法,解决对象的自动释放的问题。...在Android的源代码中,经常会看到形如:sp、wp这样的类型定义,这其实是Android中的智能指针。...在使用智能指针后,动态申请的内存将会被自动释放(有点类似Java的垃圾回收),不需要再使用delete来释放对象,也不需要考虑一个对象是否已经在其它地方被 释放了,从而使程序编写工作减轻不少,而程序的稳定性大大提高...Android智能指针实现的源码路径: frameworks/rs/cpp/util/StrongPointer.h frameworks/rs/cpp/util/RefBase.h 强指针sp(strong...pointer) 强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个 对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。

    57810

    再探 智能指针

    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、智能指针只能表示所有权...也很好举例,用智能指针写个二叉树试试。 好了就说到这儿吧,再说多了怕是以后都不敢用了。...今天之所以要写这么一篇,是最近看智能指针的好处被吹的天花乱坠的让我都有点想把以前裸指针的代码全改成智能指针了。 但是呢,不要忘了我们开头的那句话哦。

    28220

    C++智能指针详解(共享指针,唯一指针,自动指针

    前言:智能指针在C++11中引入,分为三类: shared_ptr:共享指针 unique_ptr:唯一指针 auto_ptr:自动指针 一、共享指针 几个共享指针可以指向同一个对象; 每当shared_ptr...pPoint1); //这里*pPoint1虽然被插入了两遍,但是指向的还是同一个对象 *pPoint1 = "pPoint3"; //此时vtPoint中为pPoint3,pPoint2,pPoint3 这里智能指针用到的是一种引用技术...:当一个对象被引用了多次时,那么这个对象的引用基数就会变大;当销毁引用这个对象的智能指针时,这个对象的引用基数就会变小;当引用基数变为0时,那么这个被引用对象就会被销毁,不会产生内存泄露的风险 UNIT2...; 只能使用智能指针特定的强制转换运算符: static_pointer_cast dynamic_pointer_cast const_pointer_cast UNIT4:线程安全 共享指针不是线程安全的...C++98中存在,于C++11中使用唯一指针替换其它 四、智能指针接口汇总 API Name Func Def weak_ptr wp 默认构造函数;创建一个空的弱指针 weak_ptr wp(wp2

    1.6K20
    领券