所谓智能指针,就是可以随便申请而无需管理自动释放,就像 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对象析构 // 调用了析构函数
boost 库中不单单这一种智能指针类型。...但只有 shared_ptr 是最接近普通指针的一种智能指针,他具有一些非常良好的特性,比如计数器等等,使用 shared_ptr 可以让我们不用花费精力在内存回收上。...其他的一些指针与 shared_ptr 的区别如下表: 本文主要介绍 shared_ptr 的一些特性,以后如果你使用到 boost 库,那么用到这个智能指针也会是最多的。...::shared_ptr ptr_MyClass(new MyClass()); ptr_obj = ptr_MyClass; ptr_obj->func(); // 智能指针避免普通指针和智能指针混用...// 防止智能指针计数器为0将内存释放后,普通指针就变了野指针。
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),用于解决循环引用问题。
一、产生原因 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。 三、常用操作示例 ?
/unique_ptr 二、特性: 也正是因为上面的原因,unique_ptr具有两个特性: 特性1: 替代raw pointer,来封装对象,进行操作,不需要考虑内存泄漏,参考官方文档。...Foo // unique_str调用构造函数创建指针 About to release Foo......unique_ptr(const unique_ptr &) = delete; unique_ptr& operator=(const unique_ptr &) = delete;...unique_ptr(unique_ptr &&) noexcept; unique_ptr& operator=(unique_ptr &&) noexcept;...3.并不提供 copy 操作(这里指的是copy构造和赋值构造),这是为了防止多个unique_ptr指向同一对象。但却有一个例外:可以从函数中返回一个unique_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_
在博文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指向内存类型的删除器。
在现代 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,任何形式的智能指针都不应该去托管已有的裸指针。
std中关于shared_ptr智能指针的应用,常用在网络连接管理 数据库连接、共享变量,用于自动内存资源管理(RAII机制) 但是shared_ptr其实不是线程安全的,是因为ref指针跟cnt计数是两个部分...,所以这里没有锁,是非线程安全的,那么在生产环境代码怎么实现一个线程安全的 智能指针的。...data_; } void modify(const T& new_obj) { //替换data_ std::shared_ptr...DataManager() : data_(new T) {}; std::shared_ptr get() const {... tmp = std::make_shared (new_obj); std::lock_guard lock(lock_);
shared_ptr 的构造 我们期望shared_ptr的行为尽量的接近原始指针的行为。所以shared_ptr应该支持三种构造方式 a....空构造类似与void* p =NULL; b. shared_ptr可以通过原始对象指针构造,类似于void* p = q; c. shared_ptr 可以通过已存在的shared_ptr...= m_dest_ptr) { m_ref_count->inc(); } } 用例: share_ptr_t q(p); 3. shared_ptr 获取引用计数或原始指针... 有时需要知道shared_ptr当前引用计数的值,通过shared_ptr获取原始指针理所当然。...向原始指针一样使用shared_ptr 可以这样使用shared_ptr struct foo_t { int a; } shared_ptr_t p(new foo_t())
一、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]);
C++ 11.png 本文要讲的是C++11引入的智能指针之std::unique_ptr。...std::unique_ptr系C++11引入的智能指针,拥有资源的唯一所有权,头文件 #include 。...unique_ptr指针指向的堆内存空间的引用计数为 1,如果unique_ptr 指针放弃对所指堆内存空间的所有权,那么该空间会被立即释放回收。 那么,什么时候使用unique_ptr呢?...)); std::move将sp持有的堆内存转移给sp1后,sp不再持有堆内存的引用,变成一个空的智能指针对象。...来管理动态内存,只要std::unique_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所指的内存已经被释放了 九
一、概念 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(
智能指针是C++中用于自动管理内存的工具,它们通过模拟拥有所有权的对象来防止内存泄漏,其中unique_ptr和shared_ptr是最常用的两种类型。...unique_ptr与shared_ptr概览unique_ptrunique_ptr表示独占所有权的智能指针,同一时间内只能有一个unique_ptr指向给定的资源。...忽略裸指针转换从原始指针到智能指针的转换需谨慎,特别是当原始指针已被其他地方管理时,直接构造智能指针可能会导致重复释放资源。...明智地转换裸指针在将裸指针转换为智能指针之前,确保该指针未被其他智能指针管理。使用make_shared来创建shared_ptr,以减少潜在的内存分配次数和提高效率。...是C++智能指针家族中的两大支柱,它们各自适用于不同的场景。
(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函数会返回智能指针,当资源被释放了后会产生空指针...一个指针智只能被一个智能指针维护 > 如果一个地址同时被两个或两个以上智能指针维护会出现什么事?
(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函数会返回智能指针,当资源被释放了后会产生空指针...一个指针智只能被一个智能指针维护 如果一个地址同时被两个或两个以上智能指针维护会出现什么事?
一、boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源。关于RAII的讨论可以参考前面的文 章。...下面是boost 库里面的智能指针: (一)、scoped_ptr 先来看例程: #include #include using...函数内抛出了异常,那么由于裸指针还没有被智能指针接管,就会出现内存泄漏。...两个常用的功能函数:expired()用于检测所管理的对象是否已经释放;lock()用于获取所管理的对象的强引用智能指针。...,涉及到两种智能指针,跟踪起来难度很大,我也没什么心情像分析 shared_ptr 一样画多个图来解释流程,这个例子需要解释的代码远远比shared_ptr 多,这里只是解释怎样使用,有兴趣的朋友自 己去分析一下
C++ 11 模板库的 头文件中定义的智能指针,即 shared _ptr 模板,就是用来部分解决这个问题的。...的线程安全问题 智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时++或–,这个操作不是原子的,引用计数原来是1,++了两次,可能还是2.这样引用计数就错乱了。...所以只能指针中引用计数++、–是需要加锁的,也就是说引用计数的操作是线程安全的。 智能指针管理的对象存放在堆上,两个线程中同时去访问,会导致线程安全问题。...循环引用分析: node1和node2两个智能指针对象指向两个节点,引用计数变成1,我们不需要手动delete。...如果不是new出来的对象如何通过智能指针管理呢?
一、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
领取专属 10元无门槛券
手把手带您无忧上云