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

您所在的位置:网站首页 operators怎么说 C++面试:说⼀下你理解的 C++ 中的四种智能指针

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

2023-03-13 22:48| 来源: 网络整理| 查看: 265

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

⾯试官你好,⾸先,说⼀下为什么要使⽤智能指针:智能指针其作⽤是管理⼀个指针,避免程序员申请的空间在函数结束时忘记释放,造成内存泄漏这种情况的发⽣。

然后使⽤智能指针可以很⼤程度上的避免这个问题,因为智能指针就是⼀个类,当超出了类的作⽤域时,类会⾃动调⽤析构函数,析构函数会⾃动释放资源。所以智能指针的作⽤原理就是在函数结束时⾃动释放内存空间,不需要⼿动释放内存空间。

常用接口T* get(); //用于的到C++原生指针,这个操作是比较危险的,因为脱离了智能指针的管理 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, 但并不会破坏指针所指向的内容, 函数返回的是内部指针置空之前的值;reset() 直接释放封装的内部指针所指向的内存, 如果指定了 ptr 的值, 则将内部指针初始化为该值(否则将其设置为nullptr);

下面分别说⼀下哪四种:1、 auto_ptr(C++98 的⽅案, C11 已抛弃)采⽤所有权模式。

auto_ptr p1 (new string ("hello"));

auto_ptrstd::string p2;

p2 = p1; //auto_ptr

不会报错 此时不会报错,p2剥夺了 p1 的所有权,当我们p2=p1的时候,p1失去所有权被置为nullptr。于是当程序运⾏时访问 p1 将会报错。所以 auto_ptr的缺点是:存在潜在的内存崩溃问题!

2、 unique_ptr (替换 auto_ptr)

nique_ptr 实现独占式拥有或严格拥有概念,保证同⼀时间内只有⼀个智能指针可以指向该象。它对于避免资源泄露特别有⽤。事实上就是静止使用赋值语句给他赋值。

采⽤所有权模式,还是上⾯那个例⼦unique_ptr p3 (new string (auto));unique_ptr p4;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就可以。(解决share_ptr循环相互引用的问题)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3