青浦网站制作公司,贵州十大广告公司,市场调研方法有哪些,wordpress使用方法今天我们来学习C中的一个独有的特性#xff0c;智能指针。智能指针的作用非常的强大#xff0c;它解决了C语言关于指针部分内存泄漏的BUG。那么在此处#xff0c;内存泄漏指的是什么呢#xff1f; -动态申请堆空间#xff0c;用完后不归还 -C语言中没有垃圾回收机制 -指…今天我们来学习C中的一个独有的特性智能指针。智能指针的作用非常的强大它解决了C语言关于指针部分内存泄漏的BUG。那么在此处内存泄漏指的是什么呢 -动态申请堆空间用完后不归还 -C语言中没有垃圾回收机制 -指针无法控制所有堆空间的生命周期
下面我们以一个程序的例子来说明内存泄漏大概会发生什么情况
#include iostream
#include stringusing namespace std;class Test
{int i;
public:Test(int i){cout Test(int i) endl;this-i i;}int value(){return i;}~Test(){cout ~Test() endl;}
};int main()
{for(int i 0;i5;i){Test* p new Test(i);cout p-value() endl;}return 0;
}上面的程序运行结果为 运行结果确实没有问题但是仔细分析这个程序我们就会发现我们申请了堆空间之后程序结束后没有释放也没有调用析构函数。我们这里只运行了五次循环看不出内存的泄漏问题如果是在大型程序中出现这样的错误长时间运行后肯定会出现内存泄漏的问题。
那么我们就要来解决这个问题我们的目标要求是什么呢 *需要一个特殊的指针 *指针生命周期结束时主动释放堆空间 *一个堆空间只能由一个指针标识这样可以防止多次释放指针造成程序崩溃 *杜绝指针运算和指针比较
针对以上的要求我们给出以下解决方案 -重载指针操作符-和*让类对象可以像指针一样使用它们 -只能通过类的成员函数来重载指针操作符 -重载函数不能使用参数 -只能定义一个重载函数这与不能使用参数是一个道理
以上的解决方案实际上就是我们需要的智能指针啦 那么什么是智能指针呢我们还是先来从程序来慢慢分析慢慢理解智能指针的概念。
#include iostream
#include stringusing namespace std;class Test
{int i;
public:Test(int i){cout Test(int i) endl;this-i i;}int value(){return i;}~Test(){cout ~Test() endl;}
};class Pointer
{Test* mp;
public:Pointer(Test* p NULL){mp p;}Pointer(const Pointer obj){mp obj.mp;const_castPointer(obj).mp NULL; //只能有一个指针指向堆空间}Pointer operator (const Pointer obj){if( this ! obj ){delete mp;mp obj.mp;const_castPointer(obj).mp NULL;}return *this;}Test* operator - (){return mp;}Test operator * (){return *mp;}bool isNull(){return (mp NULL);}~Pointer(){delete mp;}
};int main()
{Pointer p1 new Test(0);cout p1-value() endl;Pointer p2 p1;cout p1.isNull() endl;cout p2-value() endl;return 0;
}运行结果为
由以上程序的运行结果以及程序的本身可以看出智能指针真的很强大我们不再需要像C语言中那么复杂的去操作指针只需要在这里操作对象就可以达到指针操作的目的。同时在程序结束时指针也自动的被释放这样就避免了内存泄漏的问题。同时我们的程序也不允许出现指针的对象的比较与运算这样就不会因为指针的运算导致出现野指针的情况了~~~
总结 -指针特征操作符-和*可以被重载 -重载指针操作符可以是对象代替指针 -智能指针只能用于指向堆空间中的内存 -智能指针的最大意义在于最大限度的避免了内存泄漏的问题
想一起探讨以及获得各种学习资源加我有我博客中写的代码的原稿 qq1126137994 微信liu1126137994 可以共同交流关于嵌入式操作系统C语言C语言数据结构等技术问题。