咱们以前在 C++ 的学习中学习了有关智能指针的知识。那么智能指针的意义是现代 C++ 开发库中最重要的类模板之一;是 C++ 中自动内存管理的主要手段,它可以在很大程度上避开内存相关的问题。在 STL 标准库中的智能指针为 auto_ptr,它的特色是:一、生命周期结束时,销毁指向的内存空间;二、不能指向堆数组,只能指向堆对象(变量);三、一片堆空间只属于一个智能指针对象;四、多个智能指针对象不能指向同一片堆空间。ios
下来咱们就来使用下 auto_ptr 智能指针数组
#include <iostream> #include <string> #include <memory> using namespace std; class Test { string m_name; public: Test(const char* name) { cout << "Hello, " << name << "!" << endl; m_name = name; } void print() { cout << "I'm " << m_name << "!" << endl; } ~Test() { cout << "Goodbye, " << m_name << "!" << endl; } }; int main() { auto_ptr<Test> pt(new Test("D.T.Software")); cout << "pt = " << pt.get() << endl; pt->print(); cout << endl; auto_ptr<Test> pt1(pt); cout << "pt = " << pt.get() << endl; cout << "pt1 = " << pt1.get() << endl; pt1->print(); return 0; }
咱们定义了一个类 Test 用来讲明问题。在 main 函数中先是用 auto_ptr 指针来建立了一个指向 Test 类的指针,通过下面这个指针 pt1 的操做后,pt 指针会指向空了。咱们来看看编译结果ide
咱们看到在通过指针 pt1 指向 pt 操做以后,指针 pt 的值便为空了。并且咱们也没有 delete,它便会自动的去删除指针,执行了析构函数。下来咱们再来讲说 STL 标准库中的其它智能指针:a> shared_ptr,带有引用计数机制,支持多个指针对象指向同一片内存;b> weak_ptr,配合 shared_ptr 而引入的一种智能指针;c> unique_ptr,一个指针对象指向一片内存空间,不能拷贝构造和赋值。函数
下来咱们再来看看 QT 中的智能指针:a> QPointer,当其指向的对象被销毁时,它会被自动置空,可是它析构时不会自动销毁所指向的对象;b> QSharedPointer,引用计数型智能指针,能够被自由地拷贝和赋值,当引用计数为 0 时才删除指向的对象。咱们仍是以 QT 中的代码为例来进行分析(跟 C++ 差很少)学习
#include <QPointer> #include <QSharedPointer> #include <QDebug> class Test : public QObject { QString m_name; public: Test(const char* name) { qDebug() << "Hello, " << name << "!"; m_name = name; } void print() { qDebug() << "I'm " << m_name << "!"; } ~Test() { qDebug() << "Goodbye, " << m_name << "!"; } }; int main() { QPointer<Test> pt(new Test("D.T.Software")); QPointer<Test> pt1(pt); QPointer<Test> pt2(pt); pt->print(); pt1->print(); pt2->print(); delete pt; qDebug() << endl; qDebug() << "pt = " << pt; qDebug() << "pt1 = " << pt1; qDebug() << "pt2 = " << pt2; QSharedPointer<Test> spt(new Test("David")); QSharedPointer<Test> spt1(spt); QSharedPointer<Test> spt2(spt); spt->print(); spt1->print(); spt2->print(); return 0; }
在 QT 中的输出是用 QDebug,它里面的字符串是用 QString 表示。咱们在 QPointer 类中是手动调用 delete 的,而在 QSharedPointer 并无去调用 delete。来看看编译结果this
咱们看到已经实现了。在删除了 QPointer 类后,它的三个指针都指向为空了。这便有效的防止了内存泄漏和野指针的操做了。那么咱们介绍了这么多的智能指针后,咱们再基于咱们以前建立的智能指针,在它的基础上本身再来实现一个智能指针类模板。spa
SmartPointer.h 源码指针
#ifndef _SMARTPOINTER_H_ #define _SMARTPOINTER_H_ template < typename T > class SmartPointer { T* mp; public: SmartPointer(T* p = NULL) { mp = p; } SmartPointer(const SmartPointer<T>& obj) { mp = obj.mp; const_cast<SmartPointer<T>&>(obj).mp = NULL; } SmartPointer<T>& operator = (const SmartPointer<T>& obj) { if( this != &obj ) { delete mp; mp = obj.mp; const_cast<SmartPointer<T>&>(obj).mp = NULL; } return *this; } T* operator -> () { return mp; } T& operator * () { return *mp; } bool isNull() { return (mp == NULL); } T* get() { return mp; } ~SmartPointer() { delete mp; } }; #endif
test.cpp 源码对象
#include <iostream> #include <string> #include "SmartPointer.h" using namespace std; class Test { string m_name; public: Test(const char* name) { cout << "Hello, " << name << "!" << endl; m_name = name; } void print() { cout << "I'm " << m_name << "!" << endl; } ~Test() { cout << "Goodbye, " << m_name << "!" << endl; } }; int main() { SmartPointer<Test> pt(new Test("D.T.Software")); cout << "pt = " << pt.get() << endl; pt->print(); cout << endl; SmartPointer<Test> pt1(pt); cout << "pt = " << pt.get() << endl; cout << "pt1 = " << pt1.get() << endl; pt1->print(); return 0; }
咱们在 main 函数没有改动,只是将 auto_ptr 指针改成咱们本身实现的 SmartPointer 了,再来看看是否是和以前的效果是同样的呢?生命周期
经过对智能指针类模板的学习,总结以下:一、智能指针是 C++ 中自动内存管理的主要手段;二、智能指针在各类平台上都有不一样的表现形式;三、智能指针可以尽量的避开内存相关的问题;四、STL 和 Qt 中都提供了对智能指针的支持。
欢迎你们一块儿来学习 C++ 语言,能够加我QQ:243343083。