C++11 智能指针概述

0.什么是智能指针?

智能指针是一种用来管理资源指针的特殊对象,对象中有一个成员变量用来保存动态创建的裸指针,通过重载operator->方法实现类似于裸指针的使用方式。

1.智能指针的作用是什么?

我们平时使用C++编写代码时,动态内存管理是我们时刻关注的重点。动态内存管理不好,容易出现下述三类问题:

1、野指针(空悬指针)

一些内存单元已经被释放,但是指向这些内存的指针还在使用,这些已经释放的内存有可能被系统重新分配给应用使用,此时再使用野指针,会造成无法预测的错误。

int *p = new int(10);
delete p;

//  释放后再次访问,无法预测结果
cout << *p << endl;

2、重复释放

程序试图释放已经被释放的资源,或者已经被重新分配的资源。

int *p = new int(10);

delete p;

//  重复释放,运行时报错
delete p;

3、内存泄露

不再使用的动态内存没有进行释放,便会造成内存泄露。如果程序多次存在内存泄露行为,会导致内存占用急剧增长,最终程序会因为无法申请到足够的空闲内存而异常退出。

void TestRelease()
{
	int* p = new int(10);
    
    //  未释放p
	return;
}

这三类问题严重影响程序的高可用性。但是像JAVA这样的语言不会存在这样的问题,因为它们拥有比较好的内存回收机制,可以自动管理动态内存。为了保证资源可以正常释放,C++引入智能指针。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。

智能指针的主要思想是RAII思想,即”资源获取即初始化“:

(1)定义一个类来封装资源的分配和释放

(2)构造函数中完成资源的分配及初始化

(3)析构函数中完成资源的清理,可以保证资源的正确初始化和释放

(4)如果对象是在栈上创建的,那么RAII机制就会正常工作,当离开作用域对象会自动销毁,从而自动调用洗过后函数释放资源

2.C++11标准库中的智能指针

C++11中提供了三种智能指针来动态管理创建的对象。

1、std::shared_ptr<T>基于引用计数的智能指针,允许多个对象指向同一个资源;

2、std::unique_ptr<T>独占式智能指针,任何时刻一个资源只能由一个对象占用;

3、std::weak_ptr<T>是一种不控制所指向对象生存期的智能指针,它指向一个由shared_ptr管理的对象,将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值