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

智能指针入门 auto_ptr

所谓智能指针,就是可以随便申请而无需管理自动释放,就像 java 或 C# 的垃圾回收机制一样。我们无需关心销毁只管尽情的申请,系统提供了一个 auto_ptr 类可以使用这样的功能。...后面我们也会用简单的代码示例介绍 auto_ptr 内部是如何实现的。...A(){cout << “A constructor” << endl;}; ~A(){cout << “A destructor” << endl;}; }; void foo() { auto_ptr...; } // 析构的时候将指针销毁 SPA() { cout << “SPA” << endl; delete _p; } // 重载->,让构造出来的对象可以直接使用->运算符 A* operator...SPA ptr(new A); // 调用重载的->运算符 ptr->display(); // 调用重载的*运算符 (*ptr).display(); // 出栈后让栈上的SPA对象析构 // 调用了析构函数

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

C++的智能指针unique_ptr、shared_ptr和weak_ptr

C++的智能指针是一种特殊的指针类型,它能够自动管理内存资源,避免常见的内存泄漏和多次释放等问题。C++11引入了三种主要的智能指针:unique_ptr、shared_ptr和weak_ptr。...①unique_ptr 在C++中,unique_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配的内存资源,它提供了自动释放内存的功能。...指针语义:unique_ptr的使用方式与原始指针相似,可以通过指针操作符(->)和解引用操作符(*)来访问所指向对象的成员。...②shared_ptr 在C++中,shared_ptr是一个智能指针(smart pointer)类模板,用于管理动态分配的内存资源。...③weak_ptr 在 C++ 中,weak_ptr 是一种智能指针(smart pointer),用于解决循环引用问题。

35020

【C++】智能指针:weak_ptr

一、产生原因 weak_ptr的产生,主要是为了配合shared_ptr的使用,对于shared_ptr来说,有一种循环引用会导致shared_ptr的引用计数一直不能变为0,如此以来导致内存一直不能释放的掉...只有调用lock()创建shared_ptr指针时才会引用实际对象。 二、特性 weak_ptr的特性如下所示: 1.不具有普通指针的行为,没有重载operator*和->。...2.它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。 3.weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。...4.weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。...3.当expired()==true的时候,lock()函数将返回一个存储空指针的shared_ptr。 三、常用操作示例 ?

91310

【C++】智能指针:shared_ptr

一、产生的原因 shared_ptr的产生与unique_ptr类似,都是为了解决raw pointer的new和delete的成对使用,导致的野指针、内存泄漏、重复释放内存等。...不过shared_ptr与unique_ptr场景又有所不同,这里主要是一个raw pointer在不同的代码块之间传来传去的场景,或者指针指向的内存比较大,这段内存可以切分成很多小部分,但是他们却需要共享彼此的数据...特性2: 共享,使用shared_ptr指针可以共享同一块内存中的数据。...思想是:该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为...; private: element_type* __ptr_; // raw pointer的指针 __shared_weak_count* __cntrl_

1.2K20

C++ 智能指针(unique_ptr, shared_ptr)的源码分析

在博文https://blog.csdn.net/qq_27717921/article/details/82940519已经介绍了unique_ptr和shared_ptr的使用,但是这两类的智能指针是如何做到管理指针的呢...采用new返回的指针初始化shared_ptr,调用构造函数,在堆上开辟一块存储空间,存放指向这块空间指针的数量,这块空间的地址初始化use_c. new int(2)返回的指针用于初始化p. 2. shared_ptr...显然,p, q都保存了地址0x12fa2334,而在拷贝之前,只有一个指针保存这个地址,那么*(p.use_c) = 1, 所以进行了++*use_c。...deleter(p); } delete use_c; } use_c = nullptr; p = nullptr; } release()操作, 当*use_c == 1 时,也就代表只有一个指针指向这个内存...,当函数退出时,t调用析构函数时, 也就是最后一个对象调用析构函数时,如果t.p不是空指针时,会调用p指向内存类型的删除器。

2.5K32

【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

在现代 C + + 编程中,标准库包含智能指针智能指针可处理对其拥有的内存的分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...--Microsoft Docs 为了支持对 RAII 原则的简单采用,C++ 标准库提供了三种智能指针类型: std::unique_ptr std::shared_ptr std::weak_ptr...==================================== unique_ptr unique_ptr 类型智能指针在设计上最显著的特点是内部托管的指针一旦被创建就不能被任何形式的复制给另一个...如果非要抬杠,使用 get() 函数获取到裸指针给另外一个裸指针,那么你使用智能指针的意义又何在呢? 任何智能指针都不应该去 get 裸指针使用,更不能 delete!...因此 shared_ptr 是最常用的智能指针,也是最容易出问题的智能指针。 使用它时应当注意: 1,不要将已存在裸指针交由 shared_ptr,任何形式的智能指针都不应该去托管已有的裸指针

95920

C++(STL):03---智能指针之shared_ptr

一、shared_ptr类 头文件:#include 智能指针,是一个模板。...创建智能指针时,必须提供指针所指的类型 如果当做前提条件判断,则是检测其是否为空 shared_ptr p1; //指向stringshared_ptr> p2;...因此:我们不能将一个内置指针隐式地转换为一个智能指针,必须使用直接初始化形式来初始化一个智能指针 shared_ptr p=new int(1024); //错误shared_ptr<int...初始化另一个智能指针或者为另一个智能指针赋值 shared_ptr p(new int(42)); //引用计数变为1int *q=p.get(); //正确:使用q需要注意,不要让它管理的指针被释放...{//新语句块shared_ptr(q); //用q初始化一个智能指针对象} //语句块结束之后,智能指针对象释放它所指的内存空间int foo=*p;//错误的,p所指的内存已经被释放了 九

1.5K20

C++(STL):05---智能指针之unique_ptr

一、unique_ptr类 头文件:#include 智能指针,是一个模板。...创建智能指针时,必须提供指针所指的类型 与shared_ptr的不同之处: shared_ptr所指向的对象可以有多个其他shared_ptr智能指针 而unique_ptr所指向的对象只能有一个unique_ptr...当unique_ptr被销毁时,它所指向的对象也被销毁 二、unique_ptr类的初始化 unique_ptr指针需要绑定到一个new返回的指针上,并且不能直接将new的结果用赋值运算符“=”赋值给unique_ptr...unqie_ptr 函数的参数传递和返回值就是一个很好的例子 //因为在函数内部的unique_ptr指针随着作用域的结束会自动销毁,因此可以将其作为返回值,然后将内存传递给另一个unique_ptr指针管理...unique_ptr arr(new int[3]{ 1,2,3 }); //定义一个指向int型数组的智能指针对象unique_ptr arr2(new int[3]);

84120

C++(STL):04---智能指针之weak_ptr

一、概念 weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个shared_ptr管理的对象 拥有“弱”共享的特点 最重要的特点 一个对象被多个shared_ptr类所指向时,就会拥有多个引用计数...但是当weak_ptr指向一个shared_ptr类所指向的对象时,该对象的引用计数不会增加 因此,当最后一个对象的最后一个shared_ptr类被释放时,该对象会被释放。...即使此时仍有weak_ptr指向该对象,该对象的内存仍然会被释放 二、weak_ptr类的基本使用 我们需要用一个shared_ptr类来初始化weak_ptr类 auto p=make_shared...四、lock函数的使用 用来检测weak_ptr所指的对象是否仍然存在,如果存在就继续访问,不存在则做相应的处理 返回值: 如果weak_ptr所指的shared_pre引用计数为0,返回一个空的shared_ptr...否则,返回一个shared_ptr对象 auto p=make_shared(42); weak_ptr wp(p); if(shared_ptr np=wp.lock(

38020

C++ 新特性学习(一) -- 概述+智能指针(smart_ptr

(smart_ptr) * 如果是G++且支持c++0x草案1(tr1版本)的smart_ptr[GCC版本高于4.0] * 则会启用GNU-C++的智能指针 * * 如果是VC++且支持c++0x草案...智能指针实现了在C++下的自动内存管理,同时使智能指针的用法和普通指针没有太大的区别,最重要的是它的效率并不弱于裸指针。 据说2009年的boost的智能指针性能消耗大约在5%,这个很可以有。...其中std::shared_ptr智能指针,一下是最简单的用法 std::shared_ptr a = std::shared_ptr(new int()), b = std...另外智能指针上还有个重要的东西叫std::weak_ptr,这是智能指针的一个监视器,内部不会改变引用技术,但是可以用于获取智能指针,当资源正常时lock函数会返回智能指针,当资源被释放了后会产生空指针...一个指针智只能被一个智能指针维护 > 如果一个地址同时被两个或两个以上智能指针维护会出现什么事?

53410

C++ 新特性学习(一) -- 概述+智能指针(smart_ptr

(smart_ptr) * 如果是G++且支持c++0x草案1(tr1版本)的smart_ptr[GCC版本高于4.0] * 则会启用GNU-C++的智能指针 * * 如果是VC++且支持c++0x草案...智能指针实现了在C++下的自动内存管理,同时使智能指针的用法和普通指针没有太大的区别,最重要的是它的效率并不弱于裸指针。 据说2009年的boost的智能指针性能消耗大约在5%,这个很可以有。...其中std::shared_ptr智能指针,一下是最简单的用法 std::shared_ptr a = std::shared_ptr(new int()), b = std...另外智能指针上还有个重要的东西叫std::weak_ptr,这是智能指针的一个监视器,内部不会改变引用技术,但是可以用于获取智能指针,当资源正常时lock函数会返回智能指针,当资源被释放了后会产生空指针...一个指针智只能被一个智能指针维护 如果一个地址同时被两个或两个以上智能指针维护会出现什么事?

27620

从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr 、shared_ptr 、weak_ptr 源码分析)

一、boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源。关于RAII的讨论可以参考前面的文 章。...下面是boost 库里面的智能指针: (一)、scoped_ptr 先来看例程: #include #include using...函数内抛出了异常,那么由于裸指针还没有被智能指针接管,就会出现内存泄漏。...两个常用的功能函数:expired()用于检测所管理的对象是否已经释放;lock()用于获取所管理的对象的强引用智能指针。...,涉及到两种智能指针,跟踪起来难度很大,我也没什么心情像分析 shared_ptr 一样画多个图来解释流程,这个例子需要解释的代码远远比shared_ptr 多,这里只是解释怎样使用,有兴趣的朋友自 己去分析一下

1.2K30

从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr 、shared_ptr 、weak_ptr 源码分析)

一、boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源。关于RAII的讨论可以参考前面的文 章。...下面是boost 库里面的智能指针: ?... bad() {     f(shared_ptr(new int(2)), g()); } 如bad 函数内,假设先构造了堆对象,接着执行g(), 在g 函数内抛出了异常,那么由于裸指针还没有被智能指针接管...当栈上智能指针对象child 析构,Child 对象引用计数为0,析构Chlid 对象,它的成员parent_ 被析构,则Parent 对象引用计数 减为1,故当栈上智能指针对象parent 析构时,...因为此例子涉及到循环引用,而且是类成员引用着另一个类,涉及到两种智能指针,跟踪起来难度很大,我也没什么心情像分析 shared_ptr 一样画多个图来解释流程,这个例子需要解释的代码远远比shared_ptr

1.4K00

面试题:简单实现一个shared_ptr智能指针

C++ 11 模板库的 头文件中定义的智能指针,即 shared _ptr 模板,就是用来部分解决这个问题的。...的线程安全问题 智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时++或–,这个操作不是原子的,引用计数原来是1,++了两次,可能还是2.这样引用计数就错乱了。...所以只能指针中引用计数++、–是需要加锁的,也就是说引用计数的操作是线程安全的。 智能指针管理的对象存放在堆上,两个线程中同时去访问,会导致线程安全问题。...循环引用分析: node1和node2两个智能指针对象指向两个节点,引用计数变成1,我们不需要手动delete。...如果不是new出来的对象如何通过智能指针管理呢?

16.3K32

【C++11新特性】 C++11智能指针之weak_ptr

1、为什么需要weak_ptr? 在正式介绍weak_ptr之前,我们先来回忆一下shared_ptr的一些知识。...我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以指向同一个动态对象,并维护了一个共享的引用计数器。...weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针,它指向一个由 shared_ptr 管理的对象而不影响所指对象的生命周期,也就是将一个 weak_ptr 绑定到一个 shared_ptr...不论是否有 weak_ptr 指向,一旦最后一个指向对象的 shared_ptr 被销毁,对象就会被释放。 从这个角度看,weak_ptr更像是shared_ptr的一个助手而不是智能指针。...3.1如何创建weak_ptr实例 当我们创建一个weak_ptr时,需要用一个 shared_ptr 实例来初始化 weak_ptr,由于是弱共享,weak_ptr 的创建并不会影响 shared_ptr

1.5K10
领券