前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++语言基础篇

C++语言基础篇

作者头像
用户10216580
发布2022-12-06 14:58:42
5210
发布2022-12-06 14:58:42
举报
文章被收录于专栏:一叶知秋一叶知秋

✅作者简介:CSDN内容合伙人,全栈领域新星创作者,阿里云专家博主,华为云云享专家博主,掘金后端评审团成员                          💕前言: 学长出的这一系列专栏适合有⼀点 C++ 基础,但是⼜不怎么扎实,或者知识点串不起来的同学,说⽩了,这个专栏就是为了拯救 ⾯试突击的你,适合⾯试突击 C++ 后台岗位知识时拿来看,不敢说 100 % 涵盖了⾯试问题,但是⾄少 90%是有的。

 再次渡入繁世,人潮汹涌,眼里茫然,信仰永恒,皆为华夏

目录

C++ 语⾔基础篇

说⼀下你理解的 C++ 中的四种智能指针

1、auto_ptr(C++98 的⽅案,C11 已抛弃)采⽤所有权模式。

2、unique_ptr(替换 auto_ptr )

3、shared_ptr(共享型,强引⽤)

4、weak_ptr(弱引⽤)

C++ 语⾔基础篇

说⼀下你理解的 C++ 中的四种智能指针

⾯试官你好,⾸先,说⼀下为什么要使⽤智能指针:智能指针其作⽤是管理⼀个指针,避免咋们程序员申请的空间 在函数结束时忘记释放,造成内存泄漏这种情况滴发⽣。 然后使⽤智能指针可以很⼤程度上的避免这个问题,因为智能指针就是⼀个类,当超出了类的作⽤域是,类会⾃动 调⽤析构函数,析构函数会⾃动释放资源。所以智能指针的作⽤原理就是在函数结束时⾃动释放内存空间,不需要 ⼿动释放内存空间。

常⽤接⼝

代码语言:javascript
复制
T* get();

T& operator*();

T* operator->();

T& operator=(const T& val);

T* release();

void reset (T* ptr = nullptr);

T是模板参数, 也就是传⼊的类型;

get() ⽤来获取 auto_ptr 封装在内部的指针, 也就是获取原⽣指针;

operator() ᯿载 , operator->() ᯿载了->, operator=()᯿载了=;

realease() 将 auto_ptr 封装在内部的指针置为 nullptr, 但并不会破坏指针所指向的内容, 函数返回的是内部指 针置空之前的值; 直接释放封装的内部指针所指向的内存, 如果指定了 ptr 的值, 则将内部指针初始化为该值 (否则将其设置为

nullptr; 下⾯分别说⼀下哪四种:

1、auto_ptr(C++98 的⽅案,C11 已抛弃)采⽤所有权模式。

代码语言:javascript
复制
auto_ptr<std::string> p1 (new string ("hello"));

auto_ptr<std::string> p2;

p2 = p1; //auto_ptr 不会报错.

2、unique_ptr(替换 auto_ptr )

unique_ptr 实现独占式拥有或严格拥有概念,保证同⼀时间内只有⼀个智能指针可以指向该对象。它对于避免资 源泄露特别有⽤。 采⽤所有权模式,还是上⾯那个例⼦

代码语言:javascript
复制
unique_ptr<string> p3 (new string (auto));//#4

unique_ptr<string> p4;//#5

p4 = p3;//此时会报错

编译译器认为 p4=p3 ⾮法,避免了 p3 不再指向有效数据的问题。 因此,unique_ptr ⽐ auto_ptr 更安全。

3、shared_ptr(共享型,强引⽤)

shared_ptr 实现共享式拥有概念,多个智能指针可以指向相同对象,该对象和其相关资源会在“最后⼀个引⽤被销 毁”时候释放。从名字 share 就可以看出了资源可以被多个指针共享,它使⽤计数机制来表明资源被⼏个指针共 享。 可以通过成员函数 use_count() 来查看资源的所有者个数,除了可以通过 new 来构造,还可以通过传⼊auto_ptr, unique_ptr,weak_ptr 来构造。当我们调⽤ release() 时,当前指针会释放资源所有权,计数减⼀。当计数等于 0

时,资源会被释放。

shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性 (auto_ptr 是独占的),在使⽤引⽤计数的机制上提供了 可以共享所有权的智能指针。

4、weak_ptr(弱引⽤)

weak_ptr 是⼀种不控制对象⽣命周期的智能指针,它指向⼀个 shared_ptr 管理的对象。进⾏该对象的内存管理 的是那个强引⽤的 shared_ptr。

weak_ptr 只是提供了对管理对象的⼀个访问⼿段。weak_ptr 设计的⽬的是为配合 shared_ptr ⽽引⼊的⼀种智 能指针来协助 shared_ptr ⼯作,它只可以从⼀个 shared_ptr 或另⼀个 weak_ptr 对象构造,,它的构造和析构不会 引起引⽤记数的增加或减少。

weak_ptr 是⽤来解决 shared_ptr 相互引⽤时的死锁问题,如果说两个 shared_ptr 相互引⽤,那么这两个指针的 引⽤计数永远不可能下降为0,也就是资源永远不会释放。它是对对象的⼀种弱引⽤,不会增加对象的引⽤计数, 和 shared_ptr 之间可以相互转化,shared_ptr 可以直接赋值给它,它可以通过调⽤ lock 函数来获得

shared_ptr。 当两个智能指针都是 shared_ptr 类型的时候,析构时两个资源引⽤计数会减⼀,但是两者引⽤计数还是为 1,导 致跳出函数时资源没有被释放(的析构函数没有被调⽤),解决办法:把其中⼀个改为weak_ptr就可以。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++ 语⾔基础篇
    • 说⼀下你理解的 C++ 中的四种智能指针
      • 1、auto_ptr(C++98 的⽅案,C11 已抛弃)采⽤所有权模式。
      • 2、unique_ptr(替换 auto_ptr )
      • 3、shared_ptr(共享型,强引⽤)
      • 4、weak_ptr(弱引⽤)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档