无备案网站可以做百度推广,wordpress删除管理站点链接,专业网站建设排名,出国做博后关注哪些网站今天我们依然暂时不讲解数据结构里面的内容#xff0c;我们来复习一下昨天学的模板技术用于数据结构编程的思想#xff0c;给出一个模板技术的实例#xff1a;智能指针的应用。喜欢看我分享的加我q:1126137994 加我共同学习交流各种技术。
为什么会引入智能指针呢#xff…今天我们依然暂时不讲解数据结构里面的内容我们来复习一下昨天学的模板技术用于数据结构编程的思想给出一个模板技术的实例智能指针的应用。喜欢看我分享的加我q:1126137994 加我共同学习交流各种技术。
为什么会引入智能指针呢原因是在软件开发中最可恨最常见的BUG内存泄漏是什么导致内存泄漏
-动态申请堆空间用完后不归还 -C语言中没有垃圾回收机制 -指针无法控制堆空间的生命周期
那么引入智能指针后智能指针能做什么呢
-指针生命周期结束时主动释放堆空间 -一片堆空间最多只能由一个指针标识 -杜绝指针运算和指针比较
智能指针的设计方案 -通过类模板描述指针的行为 *能够定义不同类型的指针对象 -重载指针特征操作符-和* *利用对象模拟原生指针的行为
重要说明智能指针只能用来指向堆空间中的单个对象或者变量
下面给出代码示例我主要做的是在QT编译器中建立了一个C工程库以后所有的数据结构的代码都在这个库里实现 头文件SmartPointer.h
#ifndef SMARTPOINTER_H
#define SMARTPOINTER_Hnamespace DTLib
{template typename T //开始泛型编程
class SmartPointer
{
protected:T* m_pointer; //T类型指针public:SmartPointer(T* p NULL){m_pointer p; //首先将m_pointer置空}SmartPointer(const SmartPointerT obj) //拷贝构造函数实现一片堆空间只能由一个指针标识{m_pointer obj.m_pointer;const_castSmartPointerT(obj).m_pointer NULL;}SmartPointerT operator (const SmartPointerT obj){if (this ! obj) //判断是否自赋值不能做比较运算this当前的对象{delete m_pointer;m_pointer obj.m_pointer;const_castSmartPointerT(obj).m_pointer NULL;}return *this; //可以支持连续的赋值}T* operator- () //重载-操作符让T对象可以代表指针m_pointer{return m_pointer;}T operator* () //重载*操作符{return *m_pointer;}bool isNull() //判断是否销毁指针{return (m_pointer NULL);}T* get() {return m_pointer;}~SmartPointer() //析构函数很重要对象的生命周期结束时主动的销毁指针{delete m_pointer;}};}#endif // SMARTPOINTER_Hmain.cpp函数
#include iostream
#include SmartPointer.husing namespace std;
using namespace DTLib; //使用我们定义的命名空间class Test
{
public:Test() {cout Test() endl; //测试试验仅打印语句}~Test(){cout ~Test() endl; //测试试验仅打印语句}
};int main()
{SmartPointerTest sp new Test(); //声明一个智能指针sp指向Test对象所对应的的堆空间//SmartPointerTest nsp; //又定义了一个智能指针//nsp sp; //该智能指针指向sp指向Test对象所对应的的堆空间//cout sp.isNull() endl;//cout nsp.isNull() endl;return 0;
}
运行上面程序显示结果为 可以看出我们并没有主动去归还申请的堆空间而是程序自动的调用了析构函数销毁了Test对象所对应的申请的堆空间。
那么我们将注释掉的那几行加上编译运行 可以看出sp这个指针已经为空nsp指针不为空指向的是Test对象所对应的的堆空间最后又将这个Test对象析构销毁堆空间。 当然如果我们在main函数里加上一个nsp的运算编译就会报错因为我们已经禁止了智能指针的比较与运算。
那么到此为此我们已经实现了智能指针的实例。
总结 1.指针特征操作符-和*可以被重载 2.重载指针特征符能够使用对象代替指针 3.智能指针只能用于指向堆空间中的指针 4.智能指针的意义在于最大程度的避免内存问题
想一起探讨以及获得各种学习资源加我有我博客中写的代码的原稿 qq1126137994 微信liu1126137994 可以共同交流关于嵌入式操作系统C语言C语言数据结构等技术问题。