1、现代C++开发库中最重要的类模板之一 2、C++中自动内存管理的主要手段; 3、能够在很大程度上避开内存相关的问题。
1、生命周期结束时,销毁指向的内存空间; 2、不能指向堆数组,只能指向堆对象(变量); 3、一片堆空间只属于一个智能指针对象; 4、多个智能指针对象不能指向同一片堆空间。
实例分析1
#include <iostream> #include <string> #include <cstdlib> //#include "Array.h" #include <memory> using namespace std; class Test { string m_name; public: Test(const char* name) { cout << "Test(const char* name)" << endl; m_name = name; } void print() { cout << "I'm " << m_name << ":" << endl; } ~Test() { cout << m_name << endl; cout << "~Test()" << endl; } }; int main() { auto_ptr<Test> pt(new Test("C++ hello world")); cout << "pt = " << pt.get() << endl; //pt = 0x559049141eb0 pt->print(); cout << endl; auto_ptr<Test>pt1(pt); cout << "pt = " << pt.get() << endl; //pt = 0 cout << "pt1 = " << pt1.get() << endl; //获取申请到的堆空间的地址 pt1 = 0x559049141eb0 pt1->print(); return 0; }1、shared_ptr:带有引用计数机制,支持多个指针对象指向同一片内存; 2、werk_ptr:配合shared_ptr而引入的一种智能指针; 3、unique_ptr:一个指针对象指向一片内存空间,不能拷贝和赋值。
1、QPointer 1)、当其指向的对象被销毁时,他会被自动置空; 2)、析构时不会自动销毁所指的对象。 2、QSharedPointer 1)、引用计数型智能指针; 2)、可以被自由的拷贝和赋值; 3)、当引用计数为0时才删除指向的对象。
实例分析2
#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& 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; } } #endif1、智能指针C++中的自动内存管理的主要手段; 2、智能指针在各个平台上都有不同的表现形式; 3、智能指针能够尽可能的避免内存相关的问题; 4、STL和Qt中都有提供了对智能指针的支持。