指针算术中,++*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 << “*pA =...::shared_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,任何形式的智能指针都不应该去托管已有的裸指针。
/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 库里面的智能指针: (一)、scoped_ptr 先来看例程: #include #include using...类似,内部也有一个T* px; 成员 ,智能指针对象pp 生存期到了,调用析构函数,在析构函数内会delete px; 如下面所说: scoped_ptr mimics a built-in pointer...函数内抛出了异常,那么由于裸指针还没有被智能指针接管,就会出现内存泄漏。...,涉及到两种智能指针,跟踪起来难度很大,我也没什么心情像分析 shared_ptr 一样画多个图来解释流程,这个例子需要解释的代码远远比shared_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 导致未定义行为。
在《拥抱智能指针,告别内存泄露》中说到了内存泄漏问题,也提到了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。
一、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
智能指针是C++中用于自动管理内存的工具,它们通过模拟拥有所有权的对象来防止内存泄漏,其中unique_ptr和shared_ptr是最常用的两种类型。...unique_ptr与shared_ptr概览unique_ptrunique_ptr表示独占所有权的智能指针,同一时间内只能有一个unique_ptr指向给定的资源。...常见问题与易错点误用unique_ptr共享资源尝试复制unique_ptr会导致编译错误,因为它是独占所有权的。试图通过值传递或赋值方式分享unique_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 {... 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获取原始指针理所当然。
定义一个类,这个类有一个share指针变量,创建一个share指针指向这个类实例,然后将类实例的成员变量share指针也指向这个类实例 #include #include class Node { public: std::shared_ptrp; }; int main() { std::shared_ptrnode(new...Node()); node->p=node; std::cout<<node.use_count(); return 0; } 此时这两个share指针的引用计数都是2,当node...超过生命周期被析构时,node的引用计数变成1,不为0,那么node指向的类实例不会被析构,注意智能指针也是一个类,智能指针的析构和它指向的类实例的析构是两回事,程序中Node实例没有被析构导致p也不会析构...std::weak_ptrp; }; int main() { std::shared_ptrnode(new Node()); node->p=node;
创建智能指针时,必须提供指针所指的类型 与shared_ptr的不同之处: shared_ptr所指向的对象可以有多个其他shared_ptr智能指针 而unique_ptr所指向的对象只能有一个unique_ptr...当unique_ptr被销毁时,它所指向的对象也被销毁 二、unique_ptr类的初始化 unique_ptr指针需要绑定到一个new返回的指针上,并且不能直接将new的结果用赋值运算符“=”赋值给unique_ptr.../是错误unique_ptr p3;p3 = p1;//错误 特殊情况: 虽然两个unique_ptr不可以同时指向同一个内存对象,但是可以将一个即将销毁的unqie_ptr指针拷贝或赋值给另一个...unqie_ptr 函数的参数传递和返回值就是一个很好的例子 //因为在函数内部的unique_ptr指针随着作用域的结束会自动销毁,因此可以将其作为返回值,然后将内存传递给另一个unique_ptr指针管理...但是我们也可以通过重载来指定unqie_ptr的删除器 语法格式: 与shared_ptr重载删除器不同,unique_ptr重载删除器会影响到unique_ptr类型以及如何构造(或reset)
一、shared_ptr类 头文件:#include 智能指针,是一个模板。...创建智能指针时,必须提供指针所指的类型 如果当做前提条件判断,则是检测其是否为空 shared_ptr p1; //指向stringshared_ptr> p2;...share_ptr指针 shared_ptr factory(T arg){return make_share(arg);//返回一个share_ptr类型的智能指针} 情景一:例如下面函数调用...void use_factory(T arg){shared_ptr p=factory(arg);} 情景二:下面的函数也是 factory函数来生成一个shared_ptr指针,但是p指针通过返回值返回了...因此:我们不能将一个内置指针隐式地转换为一个智能指针,必须使用直接初始化形式来初始化一个智能指针 shared_ptr p=new int(1024); //错误shared_ptr<int
一、概念 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(
领取专属 10元无门槛券
手把手带您无忧上云