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

在C++中使用"this"的智能指针

在C++中,"this"指针是一个指向当前对象的指针,它可以用于访问当前对象的成员变量和成员函数。在C++11中,智能指针被引入,其中一种是std::shared_ptr,它是一种可以管理对象生命周期的智能指针,它可以在多个线程之间共享对象,并且在最后一个std::shared_ptr被销毁时自动释放对象。

在C++中使用智能指针的示例代码如下:

代码语言:c++
复制
#include<iostream>
#include<memory>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructor called"<< std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destructor called"<< std::endl;
    }
};

int main() {
    std::shared_ptr<MyClass> ptr1(new MyClass());
    std::shared_ptr<MyClass> ptr2(new MyClass());
    ptr1 = ptr2;
    return 0;
}

在上面的代码中,我们创建了两个std::shared_ptr对象,它们都指向一个MyClass对象。当ptr1被赋值为ptr2时,ptr1指向的MyClass对象的引用计数增加了1,并且ptr2指向的MyClass对象的引用计数也增加了1。当ptr1ptr2被销毁时,它们指向的MyClass对象的引用计数都减少了1,因此在最后一个std::shared_ptr被销毁时,MyClass对象会被自动释放。

智能指针的优点是它可以自动管理对象的生命周期,避免了内存泄漏和悬挂指针的问题。但是它也有一些缺点,比如它可能会导致循环引用的问题,因为两个对象之间的引用计数都不会减少到0,导致它们都不会被释放。因此,在使用智能指针时,需要注意避免循环引用的问题。

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

相关·内容

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

为一个C++用户使用指针可以算上是常态,但在使用过程。多时间,可能是由于new要么malloc对象,上次忘记释放结束(我会犯这样一个错误)。内存泄露。...而此时智能指针可能能够帮助我去解决问题。 智能指针(smart pointer)是利用个引用计数策略去处理指针释放,从而保证指针安全性。...SmartPtrt2(t1); SmartPtrt3(new Stub); t3=t2; t1->print(); (*t3).print(); return 0; } 面的代码...,智能指针一般都会去重载->和*操作符,从而使其表现指针表象,而且大家能够使用它像使用指针一样。...函数析构时候,我们会发现引用计数在当中所起到作用,从而避免误操作早成指针提前释放。造成指针悬挂。或者释放不彻底,造成内存泄漏问题。 版权声明:本文博客原创文章。博客,未经同意,不得转载。

37130

详解 C++ 11 智能指针

C/C++ 语言中,内存泄露问题一直困扰着广大开发者,因此各类库和工具一直努力尝试各种方法去检测和避免内存泄露,如 boost,智能指针技术应运而生。...这就是所谓 std::enable_shared_from_this 循环引用问题。我们实际开发应该避免做出这样逻辑设计,这种情形下即使使用智能指针也会造成内存泄漏。...C++ 新标准各种智能指针是如此实用与强大,现代 C++ 项目开发,读者应该尽量去使用它们。...A* m_pA; }; 同样道理,头文件使用智能指针对象作为类成员变量时,也应该优先使用前置声明去引用智能指针对象包裹类,而不是直接包含包裹类头文件。.../C++ 开发趋势,希望读者能善用和熟练使用本节介绍后三种智能指针对象。

2.7K31

C++智能指针正确使用方式

但是实际使用过程,很多人都会有这样问题: 不知道三种智能指针具体使用场景 无脑只使用shared_ptr 认为应该禁用raw pointer(裸指针,即Widget*这种形式),全部使用智能指针...本文试图理清楚三种智能指针具体使用场景,并讲解三种智能指针背后性能消耗。...C++引入了智能指针,也是为了更好描述对象所有权,简化内存管理,从而大大减少我们C++内存管理方面的犯错机会。...函数中保存智能指针 假如我们需要在函数把这个智能指针保存起来,这个时候建议直接传值。...总结 对于智能指针使用,实际上是对所有权和生命周期思考,一旦想明白了这两点,那对智能指针使用也就得心应手了。

9.8K41

使用 C++ 智能指针遇到

使用 C++ 智能指针遇到坑 阅读收益 智能指针目的就是代替原始指针,那么问题来了,原始指针都可以用智能指针代替吗?...unique_ptr默认不能copy,如果一次使用 禁止拷class 虽然move实现拷贝,unique_ptr原来指针为null,有core风险。解决办法:实现智能指针深度拷贝。...但是实际使用过程,很多人都会有这样问题: 不知道三种智能指针具体使用场景 无脑只使用 shared_ptr 认为应该禁用 raw pointer(裸指针,即 Widget * 这种形式),全部使用智能指针...对象所有权 在编程语言中,对堆对象内存管理是一个麻烦又复杂问题。一不小心就会带来问题(堆上数据通过指针来访问。) C++里多个变量指向同一块内存导致重复释放。...unique_ptr 代替全部原始指针吗? 答:不是的,如果使用不当会造成 core 或者 不执行析构函数。 成员,或者函数参数传递。

2.5K50

C++this指针使用方法.

this指针调用之前生成。类实例后函数,没有这个说法。类实例化时,仅仅分配类变量空间,并没有为函数分配空间。自从类函数定义完毕后,它就在那儿,不会跑。...C++,类和结构是仅仅有一个差别的:类成员默认是private,而结构是public。 this是类指针,假设换成结构,那this就是结构指针了。...#5:我们仅仅有获得一个对象后,才干通过对象使用this指针,假设我们知道一个对象this指针位置能够直接使用吗? this指针仅仅有成员函数才有定义。...因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象this指针位置(仅仅有成员函数里才有this指针位置)。...当然,成员函数里,你是能够知道this指针位置(能够&this获得),也能够直接使用。 #6:每一个类编译后,是否创建一个类函数表保存函数指针,以便用来调用函数?

1.2K20

C++智能指针

1.智能指针由来 C++,动态内存管理是通过一对运算符来完成,new用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象指针。...智能指针有时需要将其管理对象所有权转移给其它智能指针,使得多个智能指针管理同一个对象,比如C++ STLshared_ptr支持多个智能指针管理同一个对象。...4.智能指针实现模板 智能指针管理对象,本质上是以栈对象来管理堆对象,《Effective C++条款13称之为资源获取就是初始化(RAII,Resource Acquisition Is Initialization...掌握了上面提到C++ STL四种智能指针后,大家可能会想另一个问题:实际应用,应使用哪种智能指针呢? 下面给出几个使用指南。...C++中文版(第三版).2011:61-77 [3]C++智能指针简单剖析 [4]shared_ptr基于引用计数智能指针实现 [5] C++智能指针设计和使用 [6]C++11智能指针

3.5K30

C++智能指针

目录 1.为什么需要智能指针 2.内存泄漏问题 3.智能指针使用以及原理 ---- 1.为什么需要智能指针?...需要下一条智能指针来管理才有保证。 ②采用RAII思想或者智能指针来管理资源。 ③有些公司内部规范使用内部实现私有内存管理库。这套库自带内存泄漏检测功能选项。 ④出问题了使用内存泄漏工具检测。...定制删除器 智能指针,我们可以看到,释放资源代码为: delete _ptr; 那如果我们类型是一个数组,是一个文件类型,那么这种释放资源方式很明显是不对。...为了解决这个问题,就可以使用定制删除器。  使用shared_ptr智能指针时候,除了传入类型,我们还可以传入定制删除器。...智能指针方面: 1. C++ 98 中产生了第一个智能指针auto_ptr. 2. C++ boost给出了更实用scoped_ptr和shared_ptr和weak_ptr. 3.

71840

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...int* _pCount;//计数 mutex* _mtx;//多线程互斥 //堆上开辟-多个智能指针共享计数和互斥锁 }; 注:这里模拟并不一定就是C++真真的底层实现 8、...C++11和boost智能指针关系 C++ 98 中产生了第一个智能指针auto_ptr C++ boost给出了更实用scoped_ptr和shared_ptr和weak_ptr C++ TR1...并且这些智能指针实现原理是参考boost实现

58120

C++ 智能指针

什么是智能指针? 今天之前我对这个概念也很陌生,但是接触之后我便很喜欢这种指针了。 与其说是指针,不如说是一种基于指针模板类。 智能指针存在意义?...这三个指针模板都定义了类似指针对象,可以将new(直接或间接)地址赋给这种对象,当智能指针过期时,其析构函数将使用delete来释放内存。 来张图看比较直观: ?...上面是auto_ptr示例,另外两个也是一样。 那怎么用呢? 要创建智能指针对象,首先要包它们头文件memory....有关智能指针注意事项: List item 首先,我们把auto_ptr摈弃掉。 因为它比较老,允许多个指针指向同一个变量。 那么回收时候就会出现一个问题:一个变量被回收了多次。...List item 不要在函数实参创建shared_ptr function (shared_ptr (new int),g());//有缺陷 正确写法应该是先创建智能指针: shared_ptr

58010

C++智能指针

需要下一条智能指针来管理才有保证。 采用 RAII 思想或者智能指针来管理资源。 有些公司内部规范使用内部实现私有内存管理库。这套库自带内存泄漏检测功能选项。 出问题了使用内存泄漏工具检测。...如智能指针等; 2、事后查错型。如泄漏检测工具。 三、智能指针使用及原理 1....指针可以解引用,也可以通过 -> 去访问所指空间中内容,因此:SmartPtr 模板类还得需要将 * 、-> 重载下,才可让其像指针一样去使用。...智能指针和 RAII 关系:智能指针就是使用 RAII 这种思想一种实现!符合 RAII 思想不止有智能指针,还有其它场景!...所以我们先画一下正常图理解一下: 此时,n2 智能指针对象 _ptr 和 n1 智能指针对象 _ptr 指向节点中 next 智能指针对象 _ptr 都指向了同一个节点资源,所以该节点资源

10010

C++智能指针

一、智能指针使用及原理 1.1 为什么需要智能指针 在学习异常时候,我们知道了由于异常反复横跳可能会导致内存泄露问题,但是对于一些自定类类型来说他栈帧销毁时候会去调用对应析构函数...因此为了解决抛异常之后可能存在内存泄露问题,C++提出了智能指针来解决这个问题,他思想是RAII。下面我们将RAII来理解什么是智能指针。...(2)采用这种方式,对象所需资源在其生命期内始终保持有效 1.3 智能指针基本框架 既然是指针,还得像指针一样去使用,因此模版我们必须重载一下*和->运算符。...C++ 98 中产生了第一个智能指针auto_ptr. 2. C++ boost给出了更实用scoped_ptr和shared_ptr和weak_ptr. 3....需要注意是unique_ptr对应boostscoped_ptr。并且这些智能指针实现原理是参考boost实现

7400

C++智能指针

为了缓解异常所引发内存泄露问题,C++ 设计出了智能指针。...---- 二、C++ 智能指针 1、智能指针概念 智能指针本质上是一个类,这个类成员函数根据其功能被分为两类: RAII:RAII (资源获得即初始化 – Resource Acquisition...2、智能指针发展史 C++ 第一个智能指针名为 auto_ptr,由 C++98 提供,但由于 auto_ptr 存在极大缺陷,同时 C++98 后一个大版本 – C++11 又发布很晚,所以...3、auto_ptr auto_ptr 是 C++ 第一个智能指针,它解决智能指针拷贝问题方式是 管理权转移,即当用当前对象拷贝构造一个新对象时,会将当前对象管理资源交给新对象,然后将自己资源置空...我们也可以使用互斥锁将模拟实现 shared_ptr 改造为引用计数线程安全版本,需要注意是: 和引用计数一样,使用互斥锁方式也是增加一个互斥锁指针类型成员变量,该变量指向堆上一块空间;

17230

C++智能指针

_ptr指针 构造函数时,将指针保存起来 析构函数时,将指针释放 将申请资源,交给智能指针对象去管理 (通过这个指针 去构造一个智能指针对象,这个对象会把指针保留起来) ---- 创建对象时,...像指针一样使用 实现 operator() 和operator->,使对象可以进行解引用 和->访问成员操作 ---- 3....拷贝问题 因为没有实现拷贝构造,默认是浅拷贝 ,所以就会导致释放两次,从而报错 深拷贝是不可以,因为指针拷贝要就是浅拷贝 链表等迭代器 结构与智能指针类似,用是浅拷贝,为什么没有问题?...---- C++98和C++11之间 产生了一个 库 boost (准标准库) boost 就把智能指针问题解决了 boost 包含 scoped_ptr shared_ptr weak_ptr...解决问题 但是节点不释放了 节点使用原生指针可以释放,而使用智能指针不能释放,这样问题被称为循环引用 ---- n1与n2都是智能指针,分别去管理资源 n2对应引用计数为1,将n1_next指向

13910

C++智能指针

关于内存泄漏,我也曾在C++内存管理一文写过。 为了更好管理我们申请空间,C++引入了智能指针。 参考文章: 1.【C++】异常_ 2. ...封装了几层函数抛异常,我们也能够来通过智能指针来管理好空间。 2.智能指针完善 上述 SmartPtr 还不能将其称为智能指针,因为它还不具有指针行为。...---- 三、标准库智能指针 1.std::auto_ptr 参考文献:std::auto_ptr auto_ptr 是C++第一个智能指针,其面对拷贝构造解决办法是:转移所有权(当用当前智能指针对象拷贝出一个新对象时...,虽然引用计数我们类内加锁了,但是如果在线程智能指针资源++时候,还是不安全。...所以我们对智能指针资源操作时候,我们也需要手动加锁。 C)shared_ptr循环引用问题 虽然shared_ptr相较于以往智能指针,表现十分好,但是仍旧是有缺陷

20220

C++智能指针

C++智能指针 为什么要使用智能指针? > p400 虽然使用动态内存有时是必要,但众所周知,正确地管理动态内存是非常棘手。...为了更容易(同时也更安全)地使用动态内存,新标准库提供了两种智能指针,来管理动态对象。智能指针行为类似于常规指针,重要区别是它负责自动释放所指向对象。...这三种类型都定义memeory头文件。 原理: 将我们分配动态内存都交给有生命周期对象来处理,当对象过期时,让它析构函数删除指向内存。...release返回指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。本例,管理内存责任简单地从一个指针转给了另一个。...---- 必要时候可以转换成shared_ptr .lock(); 完美解决。 类指针,用shared指针构造weak指针,用时候,将weak指针转成shared指针来调用成员函数。

40320

C++ 智能指针

转载自:C++ 智能指针详解 简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来内存都要手动 delete。...具体使用 总括 对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,栈对象生命期即将结束时,智能指针通过析构函数释放有它管理堆内存。...,表明上述赋值成功 (*my_memory).info_extend += " other"; // 使用 operator* 返回智能指针内部对象,然后用“.”调用智能指针对象函数...这几个智能指针已经基本够我们使用了,90% 使用过标准智能指针代码就这 5 种。可如下还有两种智能指针,它们肯定有用,但有什么用处呢,一起看看吧。...总结 如上讲了这么多智能指针,有必要对这些智能指针做个总结: 1、可以使用 boost 库场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。

98740

C++智能指针用法

智能指针 智能指针是一种C++中用于管理动态分配内存工具,它们提供了更安全和方便方式来管理内存资源,以避免内存泄漏和资源管理错误。...共享资源:std::shared_ptr 允许多个智能指针共享相同资源,这可以减少内存使用,同时确保资源不再被引用时被释放。 3....用法 3.1 std::shared_ptr:共享指针 std::shared_ptr 是 C++ 标准库一个智能指针,用于管理动态分配对象生命周期。...3.2 std::unique_ptr:唯一指针 std::unique_ptr 是 C++ 标准库另一个智能指针类,用于管理动态分配对象,但与 std::shared_ptr 不同,std::...std::weak_ptr 是 C++ 标准库另一种智能指针类,它用于解决 std::shared_ptr 循环引用问题。

10910
领券