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

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

博客: www.cyhone.com 公众号:编程沉思录 --- C++11中推出了三种智能指针,unique_ptr、shared_ptr和weak_ptr,同时也auto_ptr置为废弃(deprecated...但是在实际使用过程中,很多人都会有这样问题: 不知道三种智能指针具体使用场景 无脑只使用shared_ptr 认为应该禁用raw pointer(裸指针,即Widget*这种形式),全部使用智能指针...本文试图理清楚三种智能指针具体使用场景,并讲解三种智能指针背后性能消耗。...C++引入了智能指针,也是为了更好描述对象所有权,简化内存管理,从而大大减少我们C++内存管理方面的犯错机会。...性能 因为C++zero cost abstraction特点,unique_ptr在默认情况下和裸指针大小是一样。 所以内存上没有任何额外消耗,性能是最优

9.8K41

C++智能指针用法

智能指针 智能指针是一种在C++中用于管理动态分配内存工具,它们提供了更安全和方便方式来管理内存资源,以避免内存泄漏和资源管理错误。...用法 3.1 std::shared_ptr:共享指针 std::shared_ptr 是 C++ 标准一个智能指针,用于管理动态分配对象生命周期。...访问共享对象:通过解引用 std::shared_ptr,你可以访问共享对象值,就像使用原始指针一样。...3.2 std::unique_ptr:唯一指针 std::unique_ptr 是 C++ 标准另一个智能指针类,用于管理动态分配对象,但与 std::shared_ptr 不同,std::...std::weak_ptr 是 C++ 标准另一种智能指针类,它用于解决 std::shared_ptr 循环引用问题。

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

使用 C++ 智能指针遇到

使用 C++ 智能指针遇到坑 阅读收益 智能指针目的就是代替原始指针,那么问题来了,原始指针都可以用智能指针代替吗?...开始 C++11 中推出了三种智能指针,unique_ptr、shared_ptr 和 weak_ptr,同时也 auto_ptr 置为废弃 (deprecated)。...但是在实际使用过程中,很多人都会有这样问题: 不知道三种智能指针具体使用场景 无脑只使用 shared_ptr 认为应该禁用 raw pointer(裸指针,即 Widget * 这种形式),全部使用智能指针...对象所有权 在编程语言中,对堆对象内存管理是一个麻烦又复杂问题。一不小心就会带来问题(堆上数据通过指针来访问。) C++里多个变量指向同一块内存导致重复释放。...vector容器类型,因为当vector扩容时,智能指针便不再生效,引起程序崩溃或未定义行为。

2.4K50

详解 C++ 11 中智能指针

C/C++ 语言中,内存泄露问题一直困扰着广大开发者,因此各类和工具一直在努力尝试各种方法去检测和避免内存泄露,如 boost,智能指针技术应运而生。...正因为 std::auto_ptr 设计存在如此重大缺陷,C++11 标准在充分借鉴和吸收了 boost 智能指针设计思想,引入了三种类型智能指针,即 std::unique_ptr、std:...智能指针使用注意事项 C++ 新标准提倡理念之一是不应该再手动调用 delete 或者 free 函数去释放内存了,而应该把它们交给新标准提供各种智能指针对象。...C++ 新标准中各种智能指针是如此实用与强大,在现代 C++ 项目开发中,读者应该尽量去使用它们。.../C++ 开发趋势,希望读者能善用和熟练使用本节介绍后三种智能指针对象。

2.6K31

C++智能指针学习总结

一、智能指针学习: 1、内存泄漏: 关于内存泄漏这个问题,一般都会牵扯到指针这个话题,也就是我们常说动态内存分配;然而在程序员手动进行堆空间分配时(指针无法控制所指堆空间生命周期,),往往在写完程序时候...在C++语言里面又没有垃圾回收机制(不像高级语言Java有自动垃圾回收机制,),所以程序员在写程序时候,经常会发生刚才上面说那种情况,这里我们来看一个例子: #include <iostream...需要一个特殊指针: 智能指针对象,通过类普通构造函数完成; 指针生命周期结束时候,主动释放堆空间 一片堆空间最多只能由一个指针标识:避免多次释放内存,通过拷贝构造函数和赋值操作符完成; 杜绝指针运算和指针比较...3、智能指针使用: 重载指针特征操作符(->和*) 只能通过类成员函数重载 重载函数不能使用参数 只能定义一个重载函数 代码实践: #include #include <string...智能指针类都是栈上对象,所以当函数(或程序)结束时会自动被释放 二、总结: 指针特征操作符(->和*)可以被重载 重载指针特征符能够使用对象代替指针 智能指针只能用指向堆空间中内存 智能指针意义在于最大程度避免内存问题

17710

C++中this指针使用方法.

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。 this指针仅仅能在一个类成员函数中调用,它表示当前对象地址。...由此可见,this在成员函数開始前构造,在成员结束后清除。 这个生命周期同任一个函数參数是一样,没有不论什么差别。 当调用一个类成员函数时,编译器指针作为函数this參数传递进去。...在C++中,类和结构是仅仅有一个差别的:类成员默认是private,而结构是public。 this是类指针,假设换成结构,那this就是结构指针了。...#5:我们仅仅有获得一个对象后,才干通过对象使用this指针,假设我们知道一个对象this指针位置能够直接使用吗? this指针仅仅有在成员函数中才有定义。...也有很多C语言写程序,模拟了类实现。如freetype等等。 事实上,实用过C语言的人,大多都模拟过。仅仅是当时没有明白概念罢了。

1.2K20

c++智能指针理解与简易实现

总结下个人对智能指针理解,手写一个简易c++实现,最后整理一下相关知识点,有不准确部分欢迎大佬指正。...智能指针利用c++ RAII特性和模板化编程,本质上是一个包装类,使用起来像普通指针一样方便。当最后一个引用动态对象智能指针离开作用域或不在引用动态对象后对其进行清理。...而shared_ptr尺寸是裸指针二倍,同时还有控制块开销,相比较unique_ptr要更占空间。实际c++标准也是如此,共享指针更占用资源。...智能指针管理c风格动态数组一般只考虑在一些调用c接口返回c风格动态数组时候可以使用智能指针构造函数利用explicit声明来禁止隐式转换,主要考虑到一些无法确定转换类型场景。...如上一节所说,动态数组尽量使用vector,只有在一些调用c接口返回c风格动态数组时候才使用智能指针管理。 参考:libstdc++,cppreference

73300

C++】简单实现C++11三种智能指针

绪 本篇是尝试对C++11三种智能指针(unique_ptr, shared_ptr, weak_ptr)进行复现结果, 智能指针复现在面试中经常考到, 需要好好熟悉....std::shared_ptr, 否则返回nullptr 智能指针释放依赖于作用域, 所以当需要使用更大生命周期时还是应该考虑手动管理或者在更大作用域中使用智能指针 智能指针与垃圾回收区别 相关讨论...智能指针额外开销很小 垃圾回收器由于使用标记和清理手法因此可以很好地处理循环引用问题, 智能指针如果仅仅使用引用计数的话难以处理. weak_ptr也只是优化了这个问题, 需要程序员进行深入控制...垃圾回收器不期望程序员手动控制对象回收, 因此失效对象回收时间是无法预测, 程序员只能控制需要使用生命周期(或者使用with获得一定手动控制能力), 从而难以预测性能....智能指针则完全由程序员控制 垃圾回收器对于资源释放有时候有优化, 例如大批需要释放资源集中起来一起释放, 这可以提高回收效率, 智能指针大多只能逐个释放.

1.4K20

C++核心准则R.37: 不要使用从破损智能指针​获取指针或引用

R.37: Do not pass a pointer or reference obtained from an aliased smart pointer R.37: 不要使用从破损智能指针获取指针或引用...违反本规则是引用计数丢失和发生悬空指针第一号理由。函数更应该沿着调用链向下传递原始指针和引用。你应该在调用树最顶端,从可以保证对象存在智能指针获得原始指针或引用。...你需要保证智能指针不会在调用树下面被不小心重置或者重新赋值。...(简单)如果函数调用时使用了一个从非局部智能指针变量(Unique_pointer or Shared_pointer)获取指针或者引用,报警。智能指针是局部变量但是可能是别名时也报警。...如果智能指针是一个Shared_pointer,建议获取一个智能指针局部拷贝然后从该拷贝获取指针或引用。

50230

C++使用指针,动态数组,指针做参数需要注意问题等总结

前言 指针是什么,有些萌新一听到指针就开始畏惧了,这种畏惧并不是来自指针给你,而是他人给你。我相信基本所有人都会在刚学习时候百度:C语言最难是什么?包括我。...: 我们写代码代码存储在包括栈区,堆区,数据区,代码区地方,而全局变量存储在数据区,我们不做讨论 不使用指针声明数组被称为静态数组,局部静态数组被存储在栈区 而使用指针声明数组被称为动态数组...一般由程序员分配和释放,若程序员不释放,结束程序时有可能由OS回收。...释放内存 //还有一个要注意地方,动态数组是我们自己申请内存,在程序运行完毕应进行内存释放 delete pa_5;//只调用pa_5[0]析构函数 delete[]pa_5;//整个数组全部调用析构函数...//析构函数我们现在不讲,只需要知道,对于基本指针类型,上面两种释放无异,但要是类对象,应该使用第二种。

97810

C++】函数指针 ④ ( 函数指针做函数参数 | 使用函数指针间接调用函数 | 函数指针做参数 | 函数指针类型本质 | 函数指针做参数意义 )

一、函数指针做函数参数 1、使用函数指针间接调用函数 在上一篇博客 【C++】函数指针 ③ ( 函数指针语法 | 函数名直接调用函数 | 定义函数指针变量 | 使用 typedef 定义函数类型 | 使用...动态传入 ; 函数指针类型 该用法 是框架基础 , 函数执行逻辑 与 软件框架 进行解耦 ; 也就是 任务调用者 与 任务实现者 进行了隔离 , 解耦合 ; 下面的示例中 , 可以 函数指针类型变量...其它函数中执行 ; 4、函数指针做参数意义 函数指针做参数意义 : 提高程序灵活性 : 通过使用函数指针作函数参数 , 这样可以 在 程序 运行时 动态地 设置 要调用函数 , 提高了程序灵活性...C 语言 中模拟面向对象用法 ; 可以特定 函数指针类型 定义为 结构体 一部分 , 并使用该 结构体 来传递具有特定行为对象地址 ; 该操作有助于更好地组织代码 , 使代码更易于理解和维护...; 错误处理 : 使用函数指针 , 错误处理函数作为参数传递给其他函数 , 在发生错误时立即调用适当错误处理函数 , 无需返回到调用堆栈中较高层次 ; 二、代码示例 - 函数指针做函数参数 代码示例

23450

C++ 引用计数技术及智能指针简单实现

2.普通指针存在问题 C语言、C++语言没有自动内存回收机制,关于内存操作安全性依赖于程序自觉。...程序员每次new出来内存块都需要自己使用delete进行释放,流程复杂可能会导致忘记释放内存而造成内存泄漏。而智能指针也致力于解决这种问题,使程序员专注于指针使用而把内存管理交给智能指针。...引用计数是这样一个技巧,它允许有多个相同值对象共享这个值实现。引用计数使用常有两个目的: 简化跟踪堆中(也即C++中new出来对象过程。...C++标准中string类采取一种称为”写时复制“技术,使得只有当字符串被修改时候才创建各自拷贝,否则可能(标准允许使用但没强制要求)采用引用计数技术来管理共享对象多个对象。...智能指针一个计数器与类指向对象相关联,引用计数跟踪共有多少个类对象共享同一指针

2.1K41

C++使用new来初始化指向类指针

C++使用new来初始化类指针 1.ClassName * p = new ClassName; 调用默认构造函数。...C++指针初始化问题 c++指针是一个很经典用法,但是也是最容易出错,比如定义了一个指针,必须对其进行初始化,不然这个指针指向是一个未知内存地址,后续对其操作时候,会报错。...下面就总结一下c++指针初始化一些方法,以及我自己遇到一些问题以及心得体会。...c++指针初始化一般方法 1.一个已经在内存中存在变量地址传递给定义指针 这个指针就指向这个变量内存地址(相同数据类型),完成初始化。...自己遇见问题 我在使用结构体指针时候,忘记结构体指针初始化,导致后面访问结构体成员变量时候出现错误(那种编译没错,执行出错问题),后来指针使用new初始化解决,还有一点就是,全局变量名称与局部变量名称不要一样

27320

C++编程经验(9):智能指针 -- 裸指针管得了我要管,裸指针管不了我更要管!

除了能够在适当时间自动删除指向对象外,他们工作机制很像C++内置指针智能指针在面对异常时候格外有用,因为他们能够确保正确销毁动态分配对象。...它们使用operator->和operator*来生成原始指针,这样智能指针看上去就像一个普通指针。 ---- 手写智能指针 先来个例子对着看,不然对着空气我也尴尬。...强智能指针 使用引用计数指针有:shared_ptr 和 weak_ptr,一个称为强智能指针,一个称为若智能指针。...---- 弱智能指针 从上面的实验我们得出一个结论:在使用对象时候,使用智能指针;在引用对象时候,使用智能指针。 怎么得出呢?...= nullptr) { //看一下资源是否还在 ps->testA(); } } ---- 多线程访问共享对象 在muduo中多次使用了强弱智能指针 看一下普通指针在线程中表现: void

58220

C++中关于指针初始化和使用NULL理解

1、严禁使用未被初始化指针C++创建指针时候,只分配存储地址内存,并不会分配存储数据内存,所以指针可能指向任何位置。   ...(1)使用解除运算符(*)之前,一定要对指针初始化,否则若声明指针刚好指向程序代码位置会导致一些很隐蔽错误。    (2)未被初始化之前禁止指针之间赋值。...首先看一下百科中一段关于NULL描述: NULL出现是一种约定俗成,事实上它不是C语言中关键字;把一个指针赋值为NULL,通常说法是“指针悬空”。这样,指针就无法再进行任何数据访问了。...也就是说指针赋值成NULL有些编译器是不能往里边填值,所以要使用new来分配一段合适内存才可以填值,而且使用new申请内存还可以使用delete进行配对删除,可以防止内存泄露。...所以NULL就像安全带,指针悬空,避免程序员因为大意而犯下一些不必要错误。

2.7K100

被引入C++标准!为什么说智能指针是解决问题“神器”?

导语 | 智能指针C++11标准中被引入真正标准C++98中引入auto_ptr存在较多问题),但目前很多C++开发者仍习惯用原生指针,视智能指针为洪水猛兽。...一、为什么需要使用智能指针 (一)内存泄漏 C++在堆上申请内存后,需要手动对内存进行释放。代码初创者可能会注意内存释放,但随着代码协作者加入,或者随着代码日趋复杂,很难保证内存都被正确释放。...因此在对于C++开发者而言,经常会使用静态单例来使得对象常驻内存,避免析构带来问题。这势必会造成内存泄露,当单例对象比较大,或者程序对内存非常敏感时候,就必须面对这个问题了。...智能指针使用时有较多常见错误用法,可能会导致程序异常。...使用智能指针托管对象,尽量不要在再使用原生指针 很多开发同学(包括我在内)在最开始使用智能指针时候,对同一个对象会混用智能指针和原生指针,导致程序异常。

90320
领券