前言
这篇文章将为大家带来智能指针,很多人都听过指针但是智能指针对于大家来说可能会很陌生。
一、C语言和C++中的动态内存申请
在C语言使用malloc进行动态内存的申请
在C++中使用new进行动态内存的申请
C语言:
int *p = (int*)malloc(4);
C++
int *p = new int;
在C语言和C++中使用malloc和new进行动态内存的申请,最终返回的都是指针类型。
我们申请了一段空间就必须要释放,否则就会发生内存泄漏。
在C语言和C++中分别使用free和delete进行内存的释放。
C语言:
free(p);
C++
delete p;
这样看起来只要遵守申请了内存就进行释放那就不会出现什么问题了。但是很多人申请内存后就会忘记释放,或者对同一块内存空间进行多次释放。这样就会导致很严重的BUG。
所以我们需要引入一个新的概念智能指针,智能指针可以自动释放申请到的内存,而且还保证不能多次释放同一块内存空间。
二、智能指针的创建
这里我们使用自定义类创建一个智能指针。
在析构函数中释放掉申请的内存,当程序结束时,动态申请的内存也就被释放了,这样就保证了内存不会被释放的问题了。
class Test { public: Test() { cout << "Test()" << endl; } ~Test() { cout << "~Test()" << endl; } }; class point { Test* mp; public: point(Test* p = NULL) { mp = p; } point(const point& obj) { mp = obj.mp; const_cast<point&>(obj).mp = NULL; } point& operator = (const point& obj) { if (this != &obj) { delete mp; mp = obj.mp; const_cast<point&>(obj).mp = NULL; } } Test& operator * () { return *mp; } Test* operator -> () { return mp; } ~point() { delete mp; } }; int main() { point p = new Test(); point p1(p); return 0; }
这里还重载了->和*操作符保证了可以和指针一样的使用方法。
总结
智能指针使用起来是非常方便的,有了智能指针我们就可以避免动态内存申请时出现内存泄漏等问题了。大家下去多理解一下智能指针,这个在以后的工程开发当中还是很有用的,有什么地方不懂的大家可以留言或者私信。