姓名 郭宇
学号 16130130299
【嵌牛导读】:c++ STL原理及组成
【嵌牛鼻子】:泛型编程 STL 原理
【嵌牛提问】:智能指针的使用及简单介绍
【嵌牛正文】:
c++指针操作在带来方便的同时 ,也出现了很多问题。原因在于 指针操作每个使用new创建的对象都需要使用delete删除 ,如果忘掉了会造成内存泄露之。所以会出现上述问题1是在于c++提供的指针过于原始指针相关操作的正确性全部需要人工来保证但人最容易出错。所以c++1之父 Bjarne Stroustrup 提出了 RAII 设计理念 即 把资源(内存)与指针对象的生命期绑定起来创建对象的同时立即为其分配资源,对象销毁时则立即释放资源。
1 智能指针的基本原理 把裸指针(原始指针)和与他相关的操作封装成一个类,并在对象创建的时候必定要调用构造函数以及在对象销毁时必调用析构函数,分别进行资源的分配与释放操作。当然为了保证对象的操作方式看起来与裸指针相同,这个封装类还要重载operator->和operator *。
下面为一段代码
#include<iostream>
using namespace std;
template<class T>
class myptr{
private:T *ptr;//裸指针
public:
myptr(T*p): ptr(p)//构造函数获得资源
{cout<<"生时获得资源"<<endl;}
T& operator *()
{
return *ptr;
}
T* operator->()
{
return _ptr;
}
~myptr()//析构函数
{
cout<<'' 死前释放资源"<<endl;
delete ptr;
}
};
int main(int argc, char** argv) {
int a=100;
{
myptrp(&a);//指针对象生命期开始
cout<<"打印资源"<<*p<<endl;
}
}
2 可共享资源的智能指针 : 在程序设计中 ,需要多个指针指向同一个资源, 这时 ,资源的释放 就不能单纯的取决于某一个指针对象的生命期 ,既不能在还有指针使用资源的时候其它指针释放资源 也不能在都不需要资源时没有及时释放资源。为这种指针设置可以按照规则决定资源去留的资源管理者是解决上述问题的办法之一。采用计数器作为资源管理者是实现这种智能指针的一种通用方式,技术资源使用时令计数值加一的方式向管理者登记,以减一的方式进行注销,当计数值为0时管理者立即释放资源。
如下代码
#include<iostream>
using namespace std;
template <typename T> class shareptr;
template<typename T>
class res_ptr{
private:
T* res_p; //指向 资源的裸指针
int use_num; //计数器
res_ptr(int*p): res_p(p), use_num(1){
cout<<"gouzaohanshu”"<<endl;
}
~res_ptr()//析构函数
{
delete res_p;
cout<<"xigouhanshu"<<endl;
}
friend class shareptr<T>;
};资源使用者的友元类声明
};// 类中以友元类的方式指定 资源使用者所属的类, shareptr 由于这个类的析构函数仅完成了资源释放工作 所以使用者类除了在构造函数中为计数器加一之外 ,还必须在析构函数中为计数器减一,并判断是否应释放资源.




上述为一个带有计数器的资源管理者类 !
网友评论