指针算术中,++*ptr 和 *ptr++ 的含义是不同的。
++*ptr
*ptr++
++*ptr 是先对指针指向的值进行自增操作,然后返回自增后的值。
*ptr++ 是先返回指针指向的值,然后对指针进行自增操作。
这两种操作的结果可能会不同,具体取决于应用场景。在实际编程中,应根据需要选择合适的操作。
operator->:箭头操作符,用于通过 unique_ptr 访问对象的成员函数或成员变量。 get:返回指向所管理对象的裸指针。...只有当所有shared_ptr都超出作用域或被重新赋值时,才会释放所管理的内存。 自动释放内存:当最后一个指向对象的shared_ptr超出作用域或被重新赋值时,它会自动释放所管理的内存。...operator->:箭头操作符,用于通过 shared_ptr 访问对象的成员函数或成员变量。 get:返回指向所管理对象的裸指针。...循环引用问题 循环引用问题指的是在使用shared_ptr管理对象时,存在两个或多个对象相互持有shared_ptr,形成一个循环引用的情况。...解决循环引用问题:由于 weak_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指向内存类型的删除器。
所谓智能指针,就是可以随便申请而无需管理自动释放,就像 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对象析构 // 调用了析构函数
但只有 shared_ptr 是最接近普通指针的一种智能指针,他具有一些非常良好的特性,比如计数器等等,使用 shared_ptr 可以让我们不用花费精力在内存回收上。...其他的一些指针与 shared_ptr 的区别如下表: 本文主要介绍 shared_ptr 的一些特性,以后如果你使用到 boost 库,那么用到这个智能指针也会是最多的。...ptr; boost::shared_ptr ptr_arr(new int(100)); // 与普通指针相差无几 int a = 111; int* pA = &a; cout ptr ptr_MyClass(new MyClass()); ptr_obj = ptr_MyClass; ptr_obj->func(); // 智能指针避免普通指针和智能指针混用...// 防止智能指针计数器为0将内存释放后,普通指针就变了野指针。
该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。...--Microsoft Docs 为了支持对 RAII 原则的简单采用,C++ 标准库提供了三种智能指针类型: std::unique_ptr std::shared_ptr std::weak_ptr...==================================== unique_ptr unique_ptr 类型智能指针在设计上最显著的特点是内部托管的指针一旦被创建就不能被任何形式的复制给另一个...unique_ptr 没有拷贝构造函数,因此不能用于赋值。该指针最常用的情况是单例模式和编译防火墙的封装。...因此 shared_ptr 是最常用的智能指针,也是最容易出问题的智能指针。 使用它时应当注意: 1,不要将已存在裸指针交由 shared_ptr,任何形式的智能指针都不应该去托管已有的裸指针。
C++智能指针unique_ptr 学习路线:C++智能指针shared_ptr->C++智能指针unique_ptr->C++智能指针weak_ptr 简介:本文讲解常用的智能指针的用法和原理,...包括shared_ptr,unique_ptr,weak_ptr。...unique_ptr 概述 unique_ptr(独一指针),在unique_ptr中,拷贝函数,与赋值函数都被删除了,每个指针都不能被赋值给其他指针,都是独一无二的。... p1(new Ball); // 下面这段话会报错 在unique_ptr里面 赋值函数与拷贝构造函数 // 都删除了 // unique_ptr p2...接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。
C++智能指针weak_ptr 学习路线:C++智能指针shared_ptr->C++智能指针unique_ptr->C++智能指针weak_ptr 简介:本文讲解常用的智能指针的用法和原理,包括...shared_ptr,unique_ptr,weak_ptr。...概述 weak_ptr设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少...weak_ptr(弱指针),主要用来解决shared_ptr的环型依赖问题.... school; // 这里改成弱指针 ~Teacher(){ cout << "Teacher Destructed" << endl; } };
C++智能指针shared_ptr 学习路线:C++智能指针shared_ptr->C++智能指针unique_ptr->C++智能指针weak_ptr 简介:本文讲解常用的智能指针的用法和原理,...包括shared_ptr,unique_ptr,weak_ptr。...shared_ptr 概述 shared_ptr(共享指针),对于同一个Object,共享指针会记录有多少个指针指向同一个物体,当指向Object的指针计数为0的时候,Object对象就会释放,省去了delete...endl; p.reset(); p2.reset(); p3.reset(); return 0; } 运行结果: 分析结果可知: 当指向最开始的对象Ball的指针都释放了之后...接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。
智能指针的作用就是让指针自己在合适的时候将自己以及直系那个的空间释放掉,也就是析构;如果即使地将动态空间释放,就会发生内存泄漏; 内存泄漏 什么是内存泄漏及危害 什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况...重载 operator* 和 opertaor-> ,具有像指针一样的行为; auto_ptr 智能指针头文件是;在最早期出现的智能指针是auto_ptr,但是呢auto_ptr也有很多的缺陷...; auto_ptr的使用 auto_ptr可以构造也可以拷贝,但是只能有一个auto_ptr的指针管理这一块空间,也就是只能有一个auto_ptr管理员;当auto_ptr拷贝时,原有的指针就会把管理权转交给新指针...,然后原有指针就会变成了nullptr,"我不管了,你管吧",就是这么潇洒;因为指针拷贝是经常需要进行的操作,所以这也是auto_ptr的缺陷,不受待见的原因; auto_ptr的关键就在于管理权的转让...智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时++或 -- ,这个操作不是原子的,引用计数原来是 1 , ++ 了两次,可能还是 2. 这样引用计数就错乱了。
/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_
一、产生原因 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。 三、常用操作示例 ?
C++ 中 shared_ptr 和 unique_ptr 是 C++11 之后被广泛使用的两个智能指针,但是其实他们在使用上还是有一些“秘密”的,我根据平时遇到的两个问题,总结记录一些知识。...在 unique_ptr 内部会保存类型为 T* 和 Deleter 的成员 ,分别表示保存的裸指针和删除器。...总结unique_ptr 只保存了类型指针 ptr 和这个指针的析构方法,调用 delete ptr,就需要ptr的完整类型,为了防止这个问题出现,直接通过 assert sizeof 排除掉了这种风险...unique_ptr 相当于在编译时绑定了删除器。shared_ptr 保存的是一个控制块的指针。控制块包含的就是一个引用计数和一个原来对象的裸指针。...虽然只是一个小小的知识点,但是也帮助我深入理解了 shared_ptr 和 unique_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
一、boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源。关于RAII的讨论可以参考前面的文 章。...下面是boost 库里面的智能指针: (一)、scoped_ptr 先来看例程: #include ptr.hpp> #include using...类似,内部也有一个T* px; 成员 ,智能指针对象pp 生存期到了,调用析构函数,在析构函数内会delete px; 如下面所说: scoped_ptr mimics a built-in pointer...函数内抛出了异常,那么由于裸指针还没有被智能指针接管,就会出现内存泄漏。...,涉及到两种智能指针,跟踪起来难度很大,我也没什么心情像分析 shared_ptr 一样画多个图来解释流程,这个例子需要解释的代码远远比shared_ptr 多,这里只是解释怎样使用,有兴趣的朋友自 己去分析一下
智能指针是C++中用于自动管理内存的工具,它们通过模拟拥有所有权的对象来防止内存泄漏,其中unique_ptr和shared_ptr是最常用的两种类型。...unique_ptr与shared_ptr概览unique_ptrunique_ptr表示独占所有权的智能指针,同一时间内只能有一个unique_ptr指向给定的资源。...常见问题与易错点误用unique_ptr共享资源尝试复制unique_ptr会导致编译错误,因为它是独占所有权的。试图通过值传递或赋值方式分享unique_ptr管理的资源是错误的。...循环引用导致的内存泄漏使用shared_ptr时,如果不小心形成了循环引用(两个或多个shared_ptr互相引用形成闭环),即使所有指向它们的普通引用都已消失,它们的引用计数也不会降为零,从而导致资源无法释放...重新设计数据结构:避免不必要的相互引用,或使用其他设计模式(如观察者模式)来替代直接的相互持有。明智地转换裸指针在将裸指针转换为智能指针之前,确保该指针未被其他智能指针管理。
在《拥抱智能指针,告别内存泄露》中说到了内存泄漏问题,也提到了C++中的智能指针基本原理,今天就来说说类模板unique_ptr。 在此之前,先回答读者的一个提问:C语言中该怎么办?...;//空的unique_ptr 含义分别如下: T unique_ptr管理的对象类型 D 删除器类型 t unique_ptr管理的对象 d 删除器函数/function对象等,用于释放对象指针 这里使用了...关于函数指针,可参考《高级指针话题-函数指针》。 即便后面执行出现异常时,这个socket连接也能够正确关闭。...unique_ptr不支持普通的拷贝和赋值 需要特别注意的是,由于unique_ptr“独有”的特点,它不允许进行普通的拷贝或赋值,例如: std::unique_ptr up0; std::...因为相比于shared_ptr,它的开销更小,甚至可以说和裸指针相当,它不需要维护引用计数的原子操作等等。 所以说,如果有可能,优先选用unique_ptr。
shared_ptr template class shared_ptr; (C++11 起) 多个shared_ptr管理同一个指针,仅当最后一个shared_ptr析构时,指针才被...引用计数指的是,所有管理同一个裸指针(raw pointer)的shared_ptr,都共享一个引用计数器,每当一个shared_ptr被赋值(或拷贝构造)给其它shared_ptr时,这个共享的引用计数器就加...1,当一个shared_ptr析构或者被用于管理其它裸指针时,这个引用计数器就减1,如果此时发现引用计数器为0,那么说明它是管理这个指针的最后一个shared_ptr了,于是我们释放指针指向的资源。...多个无关的shared_ptr管理同一裸指针 只能通过复制构造或复制赋值其值给另一 shared_ptr ,将对象所有权与另一 shared_ptr 共享。...用另一 shared_ptr 所占有的底层指针创建新的 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 {...ptr> 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...为了简单,shared_ptr类遵循一个原则m_dest_ptr和m_ref_count 同时为NULL,或同时不为NULL。 其中 object_t 为模板类型的别名。...= m_dest_ptr) { m_ref_count->inc(); } } 用例: share_ptr_t q(p); 3. shared_ptr 获取引用计数或原始指针... 有时需要知道shared_ptr当前引用计数的值,通过shared_ptr获取原始指针理所当然。
领取专属 10元无门槛券
手把手带您无忧上云