c++面试——智能指针

为什么使用智能指针(什么是智能指针)?

使用指针申请的空间,很可能在函数结束时忘记释放,或还没有执行到释放空间的代码就已经跳出函数,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,
智能指针定义了类似指针的对象,可以将new获得的地址赋给这种对象,管理在堆上分配的内存;当智能指针过期时,其析构函数将使用delete来释放内存,这些内存将自动被释放。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
使用时需包含memory头文件,在std命名空间中。

智能指针有哪些?

C++中有四个智能指针:Auto_ptr 、unique_ptr 、shared_ptr、 weak_ptr,其中后三个是c++11支持的,auto_ptr已经被c++11弃用。
Auto_ptr、unique_ptr的策略是建立所有权的概念,对于特定的对象,只能有一个智能指针可拥有它,这样只有拥有对象的智能指针的构造函数会删除该对象,然后,让赋值操作转让所有权。

Auto_ptr

当尝试将一个auto_ptr指针p1赋值给另一个p2时,p2剥夺了p1的所有权,当程序访问p1时会报错,所以auto_ptr存在潜在的内存崩溃问题。

unique_ptr

unique_ptr比auto_ptr更严格,如果程序试图将一个unique_ptr指针p1赋给另一个p2时,如果p1是个临时的右值,很快被销毁,编译器允许这样做,如果p1将存在一段时间,编译器将禁止这样做。

shared_ptr

Shared_ptr实现共享式拥有概念最常用的智能指针,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配,当新增一个指针指向内存时,引用计数加一,当指针过期时,引用计数减一,只有引用计数为0时,智能指针才会释放内存资源。
Shared_ptr可能会带来内存泄漏:当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,从而导致内存泄漏。(如何解决?解决方法:weak_ptr。)代码举例如下:

#include <iostream>
#include<memory>
using namespace std
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值