目录
4、weak_ptr 弱智能指针 可以解决强智能指针相互引用的问题
一、了解智能指针
1、 智能指针:c++的自我内存回收机制的实现
在以前的学习中,对于堆上内存的使用,我们一般使用new和delete来进行开辟内存和用完之后的释放内存。但总会在不经意的时候忘记delete,导致内存泄露。了解一点java语言应该知道,在java中只有new没有delete。因为java有自己的垃圾回收机制。
那么,对于内存的回收机制应该怎样理解
首先看这样一句代码:
int *p = new int;
分析这句代码:首先在对上new一个四字节的空间,p作为一个指针变量,属于栈上资源,它对堆上开辟的内存具有所有权即包括管理权和释放权。即就是说p管理对上开辟的资源。如图所示:
栈上的资源是系统开辟,系统释放的;而堆上的资源是一般情况下是用户开辟用户释放。那么,要实现内存的自我回收机制即就是要做到用户开辟,系统释放。主要目的是为了防止内存泄露。因此,在这里c++利用智能指针来完成。
2、 智能指针是面向对象的指针,以对象的形式做指针的事;
先来看看对象的生成和销毁:
对象的生成有两步:1.开辟空间;
2.调用构造函数进行初始化;
对象的销毁有两步:1.调用析构函数释放资源;
2.释放空间;
以一个对象管理对上开辟的资源,这个对象含有对堆上开辟的内存的所有权,即做着上图的p的事情;
在我们的标准库里边有这几种智能指针:auto_ptr;当然在boost库里,有这么几种:scope_ptr(又被称为unique_ptr),scope_arr,shared_ptr,shared_arr,weak_ptr,weak_arr等我主要学习了auto_ptr、score_ptr、shared_ptr、weak_ptr这几种智能指针。因此本文也会着重介绍这几种常用的智能指针。分析每种智能指针解决了什么问题?它的缺点?以及哪种新的智能指针解决上个遗留的问题等等。
二、介绍几种智能指针
1、auto_ptr
该智能指针主要解决的问题是保证所有权唯一;
首先分析这样一个过程,有三个对象生成,他们对同一块对内都具管理权权;如图:
sp1、sp2、sp3对内存都有所有权,即都可以操作开辟的内存单元。若当sp3结束释放资源后,会将堆上内存还回,则sp1、sp2会指向非法内存,当sp1或者sp2释放时,程序会崩溃,因为释放的是不可访问的内存;所以,对于这种情况的解决方法就是保证其对象的所有权唯一,如下图所示:
sp1对该堆上开辟的资源具有所有权,当sp2要指向并管理该堆上内存时,收回sp1的所有权,将权利赋给sp2;这样就保证了所有权的唯一;
对于解决这一问题的简单实现如下:(模拟实现简单的auto_ptr)
/*
代码一: