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

C++ - 我们为什么要使用operator - >来访问SmartPtr的成员函数?

在C++中,我们使用operator->来访问SmartPtr的成员函数,是因为SmartPtr是一种智能指针,它可以自动管理指针的生命周期,避免内存泄漏和悬垂指针的问题。当我们使用operator->来访问SmartPtr的成员函数时,实际上是在调用指针所指向的对象的成员函数。

使用operator->的主要原因是为了简化代码,使得我们可以像操作普通指针一样操作SmartPtr。例如,我们可以使用以下代码来访问SmartPtr的成员函数:

代码语言:txt
复制
SmartPtr<MyClass> ptr(new MyClass());
ptr->myFunction();

这段代码等价于:

代码语言:txt
复制
SmartPtr<MyClass> ptr(new MyClass());
(*ptr).myFunction();

使用operator->可以让我们更方便地操作SmartPtr,而不需要显式地使用*操作符来解引用指针。此外,使用operator->还可以避免多次解引用的问题,从而提高代码的可读性和可维护性。

总之,我们使用operator->来访问SmartPtr的成员函数,是为了简化代码,提高代码的可读性和可维护性,同时避免内存泄漏和悬垂指针的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++智能指针

在创建智能指针类之前,我们先创建一个辅助类。这个类所有成员皆为私有类型,因为它不被普通用户所使用。为了只为智能指针使用,还需要把智能指针类声明为辅助类友元。...与u_s2.reset()等价 6.2为什么摒弃auto_ptr[3]^{[3]} unique_ptr 虽然拥有auto_ptr全部功能,但是为什么摒弃auto_ptr。...我查了一下在使用unique_ptr来访问资源前,是否有判断API,可惜查阅了C++ reference,并没有发现unique_ptr提供判空接口,希望C++标准以后能够继续完善unique_ptr...6.3.2用法 使用weak_ptr成员函数use_count()可以观测资源引用计数,另一个成员函数expired()功能等价于use_count()==0,但更快,表示被观测资源(也就是shared_ptr...weak_ptr可以使用一个非常重要成员函数lock()从被观测shared_ptr获得一个可用shared_ptr管理对象, 从而操作资源。

3.5K30

STL四种智能指针

我查了一下在使用unique_ptr来访问资源前,是否有判断API,可惜查阅了C++ reference,并没有发现unique_ptr提供判空接口,希望C++标准以后能够继续完善unique_ptr...这个类所有成员皆为私有类型,因为它不被普通用户所使用。为了只为智能指针使用,还需要把智能指针类声明为辅助类友元。这个辅助类含有两个数据成员:计数count与基础对象指针。...> &sp) :rp(sp.rp) { ++rp->count; } //复制构造函数 SmartPtr& operator=(const SmartPtr& rhs) //...4.2用法 使用weak_ptr成员函数use_count()可以观测资源引用计数,另一个成员函数expired()功能等价于use_count()==0,但更快,表示被观测资源(也就是shared_ptr...weak_ptr可以使用一个非常重要成员函数lock()从被观测shared_ptr获得一个可用shared_ptr管理对象, 从而操作资源。

2.7K41
  • C++11新特性--智能指针

    为什么会有智能指针??? C++程序员在编写代码过程往往都会涉及到堆内存开辟和释放,使用new和delete关键字。...综上三个例子,对于C++使用堆内存资源并造成内存泄漏几率还是非常大,即使你非常小心仔细处理每一个可能会被泄漏堆内存,也难免会出现一些问题。...这无疑要求C++程序员对于对内存使用要求之高,而智能指针诞生解放了C++程序员对于堆内存管理。...使用智能指针前提是利用了当栈对象生存周期结束时,会自动调用析构函数,来进行对对象销毁。RAII技术。智能指针不能再堆上创建。...countMap.getRef(_ptr);} private: T* _ptr; static resCountMap _countMap;//是所有智能指针对象公有的,设置为static }; //在类外进行静态成员函数初始化

    27210

    C++ 引用计数技术及智能指针简单实现

    2.普通指针存在问题 C语言、C++语言没有自动内存回收机制,关于内存操作安全性依赖于程序员自觉。...引用计数是这样一个技巧,它允许有多个相同值对象共享这个值实现。引用计数使用常有两个目的: 简化跟踪堆中(也即C++中new出来对象过程。...C++标准库中string类采取一种称为”写时复制“技术,使得只有当字符串被修改时候才创建各自拷贝,否则可能(标准库允许使用但没强制要求)采用引用计数技术来管理共享对象多个对象。...这个类所有成员皆为私有类型,因为它不被普通用户所使用。为了只为智能指针使用,还需要把智能指针类声明为辅助类友元。这个辅助类含有两个数据成员:计数count与基础对象指针。...SmartPtr(const SmartPtr &sp) :rp(sp.rp) { ++rp->count; } //复制构造函数 SmartPtr& operator=(const

    2.2K41

    C++ RCSP智能指针简单实现与应用

    智能指针实现代码来源博客:《http://blog.csdn.net/to_be_better/article/details/53570910》 修改:添加 get()函数,用以获得原始指针(raw...其余思路来源《Effective C++》 智能指针实现代码如下: template class SmartPtr; template class...=(const Uncopyable &); }; 一个应用例子: 目的是创建一个类智能指针,用以描述文件一些属性类,在后续代码中使用这个指针来赋予或读取这些属性。...由成员函数:createFileAttrs() 产生动态创建一个静态智能指针,由这个指针去给类中成员变量分配资源,并返回这个指针,即可实现功能。...=,所以直接使用智能指针比较合适,需要原始指针的话调用get()函数即可。

    54420

    C++基础知识

    在静态成员函数实现中不能直接引用类中说明非静态成员,可以引用类中说明静态成员(这点非常重要)。如果静态成员函数引用非静态成员时,可通过对象来引用。...从中可看出,调用静态成员函数使用如下格式:::(); C++和C区别 设计思想上 C++是面向对象语言,而 C 是面向过程结构化编程语言 语法上 C++具有重载...对于未定义 const 版本成员函数我们通常需要使用 const_cast 来去除 const引用对象 const,完成函数调用。...另外一种使用方式,结合 static_cast,可以在非 const 版本成员函数内添加 const,调用完 const 版本成员函数后,再使用 const_cast 去除 const限定。...为什么使用智能指针: 智能指针作用是管理一个指针,因为存在以下这种情况:申请空间在函数结束时忘记释放,造成内存泄漏。

    1.4K32

    C++】智能指针

    一、为什么需要智能指针? 在我们异常一节就已经讲过,当使用异常时候,几个函数层层嵌套,其中如果抛异常就可能导致没有释放堆区开辟空间。这样就很容易导致内存泄漏。...关于内存泄漏,我也曾在C++内存管理一文中写过。 为了更好管理我们申请空间,C++引入了智能指针。 参考文章: 1.【C++】异常_ 2. ...在封装了几层函数中抛异常,我们也能够来通过智能指针来管理好空间。 2.智能指针完善 上述 SmartPtr 还不能将其称为智能指针,因为它还不具有指针行为。...5.定制删除器 我们在析构函数中只用了delete来释放申请空间,那么如果我们使用new[ ] 来申请空间,那么同样我们也需要用 delete[ ] 来释放空间。 为此,我们就需要定制删除器。...定制删除器本质上是一个仿函数。与我们在哈希一文中提到hashfunc一样。 我们还需要再shared_ptr类中增加一个成员变量 _del 来实现释放空间。

    21820

    C++修炼之路】32.智能指针

    一.为什么需要智能指针?...那么,直接通过构造函数构造,省略掉p1和p2,会简单很多,但是Smartptr作为我们自己定义类,不能像p1和p2一样解引用,因此如果想直接进行解引用可以考虑解引用运算符重载: #include<iostream...首先,shared_ptr中引用计数count不能单纯定义成一个int类型成员变量,因为这就意味着shared_ptr对象都有一个自己count成员变量,而当多个对象管理同一个资源时,这几个对象应该用到是同一个引用计数...但我们是直接用一个类来模拟实现shared_ptr,因此不能将删除器类型设置为构造函数模板参数。...D _del; //管理资源对应删除器 }; } 这时我们模拟实现shared_ptr就支持定制删除器了,但是使用起来没有C++标准库中那么方便。

    22250

    C++智能指针详解

    动态分配资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。 1.2 智能指针历史历程 C++ 98 中产生了第一个智能指针auto_ptr。...并且这些智能指针实现是参照boost中实现。 1.3 为什么需要智能指针 1.3.1 内存泄漏 我们在讲为什么之前先来了解一下什么是内存泄漏。...拷贝构造函数,用传入对象资源来构造当前对象,并将传入对象管理资源指针悬空。 3.2 unique_ptr 需要引用memory库来使用。...,所以我们C++98方式是将拷贝构造函数和拷贝赋值函数声明为私有;C++11方式就直接在这两个函数后面加上=delete。...在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象引用计数减 一。

    10810

    C++】智能指针

    智能指针 一、为什么需要智能指针?...在C++异常学习部分,我们也发现异常也有很多问题,例如我们先分析一下下面这段程序问题: int div() { int a, b; cin >> a >> b;...库里面给我们提供了一个具有定制删除器构造函数,如下: 那么这个定制删除器如何使用呢?...所以,我们可以使用前面学过包装器解决这个问题,我们需要在成员变量中加一个包装器,如下: private: T* _ptr; int* _pcount; function...> sp3(new ListNode); 上面这种情况也会出现问题,因为这个时候我们没有传可调用对象,它就默认调了第一个个构造函数,即没有定制删除器构造函数,但是我们在析构函数时候是使用包装器进行释放资源

    12410

    c++】智能指针详解&&c++特殊类设计&&c++类型转换

    为什么需要智能指针? 下面我们先分析一下下面这段程序有没有什么内存方面的问题?...C++11 C++11扩展delete用法,delete除了释放new申请资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数 class CopyBan { //...防止别人调用拷贝在栈上生成对象 提供一个静态成员函数,在该静态成员函数中完成堆对象创建 class HeapOnly { public: static HeapOnly* CreateObject...6.1 为什么C++需要四种类型转换 C风格转换格式很简单,但是有不少缺点: 隐式类型转化有些情况下可能会出问题:比如数据精度丢失 显式类型转换将所有情况混合在一起,代码不够清晰 因此C++...提出了自己类型转化风格,注意因为C++兼容C语言,所以C++中还可以使用C语言转化风格 6.2 C++强制类型转换 标准C++为了加强类型转换可视性,引入了四种命名强制类型转换操作符: static_cast

    11710

    【C++11】智能指针

    ---- 二、智能指针使用与原理 智能指针使用 template class SmartPtr { public: SmartPtr(T* ptr) :_ptr(ptr)...还可以与普通指针一样使用,需对*和->以及[]进行运算符重载 通过SmartPtr对象,无论程序是正常执行结束,还是因为某些中途原因进行返回,或者抛出异常等开始所面临困境,只要SmartPtr对象生命周期结束就会自动调用对应析构函数...我们是直接用一个类来模拟实现shared_ptr,不能将删除器类型设置为构造函数参数模板,因为删除器不是在构造函数中调用,而是在Release中进行调用,所以需要多加一个成员变量把删除器保存下来...,那么在构造shared_ptr对象指明仿函数类型。...如果传入删除器是Lambda表达式,那么就很麻烦了,Lambda表达式类型难以获取,毕竟我们模拟实现shared_ptr肯定是使用起来没有C++标准库中那么方便: //定制删除器 template

    20940

    智能指针

    sp = new int(1); cout << div() << endl; } 针对上边场景我们可以设计一个SmartPtr类,这个类构造函数接收一个资源管理权,析构函数释放这份资源...智能指针 上边SmartPtr类,就是RAII,但是只有管理资源释放功能,并没有指针解引用和->操作,不能对管理资源进行控制,那么我们如何让SmartPtr支持像指针一样行为呢?...shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象引用计数减一 如果引用计数是0,就说明自己是最后一个使用该资源对象...我们其实期望是对一份资源管理,这一份资源要有独立引用计数,但是用静态成员变量做不到这一点,无论多少份资源,它们会共享一份引用计数,这样就会导致资源泄漏问题。...所以,静态成员变量这种方案是不行,那么应该怎么做呢?我们引入第二种方案。

    33520

    C++智能指针

    目录 1.为什么需要智能指针 2.内存泄漏问题 3.智能指针使用以及原理 ---- 1.为什么需要智能指针?...⭐系统内存泄漏 指程序使用系统分配资源,比方套接字、文件描述符、管道等没有使用对应函数释放掉,导致系统资源浪费,严重可导致系统效能减少,系统执行不稳定。...3.2智能指针使用以及原理 使用RAII思想设计SmartPtr类: template class SmartPtr { public: //RAII //保存资源 SmartPtr...为了解决这个问题,就可以使用定制删除器。  在使用shared_ptr智能指针时候,除了传入类型,我们还可以传入定制删除器。...boost库我们可以看作是C++官方库先锋队,它为C++官方库开辟道路,让官方库从中吸取经验。

    73140

    C++智能指针

    C++智能指针 零、前言 一、为什么需要智能指针 二、内存泄漏 三、智能指针 1、RAII 2、智能指针原理 3、std::auto_ptr 4、std::unique_ptr 5、std::shared_ptr...6、std::weak_ptr 7、删除器 8、C++11和boost中智能指针关系 零、前言 本章主要讲解学习C++中智能指针概念及使用 一、为什么需要智能指针 示例: double Division...假设程序设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak 系统资源泄漏: 指程序使用系统分配资源,比方套接字、文件描述符、管道等没有使用对应函数释放掉...即我们实际上把管理一份资源责任托管给了一个对象 好处: 不需要显式地释放资源 对象所需资源在其生命期内始终保持有效 示例: // 使用RAII思想设计SmartPtr类 template..., unlock, try_lock等接口. lock_guard没有多余接口;构造函数时拿到锁,析构函数时释放锁 lock_guard比unique_lock省时 模拟实现lock_guard:

    60520

    C++航海王:追寻罗杰编程之路】智能指针

    系统资源泄漏 指程序使用系统分配资源,比如套接字、文件描述符、管道等没有使用对应函数释放掉,导致系统资源浪费,严重可导致系统效能减少,系统执行不稳定。...// 使用RAII思想设计SmartPtr类 template class SmartPtr { public: SmartPtr(T* ptr = nullptr) : _ptr...在对象销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象引用计数减一。 如果引用计数是0,就说明自己是最后一个使用该资源对象,必须释放该资源。...// 3.下面代码我们使用SharedPtr演示,是为了方便演示引用计数线程安全问题, // 将代码中SharedPtr换成shared_ptr进行测试,可以验证库shared_ptr,发现结论是一样...但是_next属于node成员,node1释放了,_next才会析构,而node1由_prev管理,_prev属于node2成员,所以这就叫循环引用,谁也不释放。

    5310

    C++智能指针「建议收藏」

    就好比SmartPtr* ptr = new SmartPtr();这段代码中,在堆空间定义一个智能指针,这依然需要我们手动进行delete,否则堆空间对象无法释放,因为堆空间对象无法利用出作用域自动调用析构函数...所以一般不使用auto_ptr 一般我们也不在容器中使用auot_ptr,以下程序会导致vec1中指针元素全部为NULL vector> vec1; vector<auto_ptr...auto_ptr可以任意转移资源所有权,而scoped_ptr不会转移所有权(因为拷贝构造和赋值被禁止了) 由于scoped_ptr无法进行任何拷贝构造函数operator=赋值,一般也不推荐使用...) << endl; // true ptr2 = std::move(ptr1); // 使用右值引用operator=赋值重载函数 cout <<...:seconds(2)); return 0; } 五、自定义删除器 通常我们使用智能指针管理资源是堆内存,当智能指针出作用域时候,在其析构函数中会delete释放堆内存资源,但是除了堆内存资源

    44310

    智能指针讲解

    1.为什么智能指针 首先我们分析一段代码: 1、如果p1这里new 抛异常会如何? 2、如果p2这里new 抛异常会如何? 3、如果div调用这里又会抛异常会如何?...我们先来了解内存泄漏: 2.内存泄漏 2.1 什么是内存泄漏 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用内存情况。...2 系统资源泄漏 指程序使用系统分配资源,比方套接字、文件描述符、管道等没有使用对应函数释放掉,导致系统资源浪费,严重可导致系统效能减少,系统执行不稳定。...所以我们还需要重载它一些指针所需操作符: 例如-> 和* template class SmartPtr { public: SmartPtr(T* ptr = nullptr...在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象引用计数减一。

    10211

    C++11智能指针

    2.2 内存泄漏分类(了解) C/C++程序中一般我们关心两种方面的内存泄漏: 堆内存泄漏(Heap leak) 堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc...系统资源泄漏 指程序使用系统分配资源,比方套接字、文件描述符、管道等没有使用对应函数释放掉,导致系统资源浪费,严重可导致系统效能减少,系统执行不稳定。...// 使用RAII思想设计SmartPtr类 template class SmartPtr { public: SmartPtr(T* ptr = nullptr)...在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象引用计数减一。...但是_next属于node成员,node1释放了,_next才会析构,而node1由_prev管理,_prev属于node2成员,所以这就叫循环引用,谁也不会释放。 ?

    56320

    C++在设计和使用智能指针

    为一个C++用户使用指针可以算上是常态,但在使用过程中。多时间,可能是由于new要么malloc对象,上次忘记释放结束(我会犯这样一个错误)。内存泄露。...智能指针(smart pointer)是利用个引用计数策略去处理指针释放,从而保证指针安全性。 通常情况下,我们会自己去设计一个智能指针类去管理自己指针对象。...赋值操作符降低左操作数所指对象引用计数(假设引用计数为减至0,则删除对象),而且添加右操作数所指对象引用计数;调用析构函数时。构造函数降低引用计数(假设引用计数减至0,删除基础对象)。...return 0; } 在面的代码中,智能指针一般都会去重载->和*操作符,从而使其表现指针表象,而且大家能够使用它像使用指针一样。...在函数析构时候,我们会发现引用计数在当中所起到作用,从而避免误操作早成指针提前释放。造成指针悬挂。或者释放不彻底,造成内存泄漏问题。 版权声明:本文博客原创文章。博客,未经同意,不得转载。

    38130
    领券