STL库的智能指针:auto_ptr
1. auto_ptr声明周期结束时,自动销毁指向的内存空间。(内存泄漏)
2. 不能指向堆数组,只能指向堆空间单个对象或变量。
3. 不能进行指针运算和指针比较。
4. 多个auto_ptr不能指向同一个堆空间。
#include <iostream> #include <string> #include <memory> // 智能指针类模板库 using namespace std; class Test { string m_name; public: Test() { cout << "Test constructor" << endl; } ~Test() { cout << "Test destructor "<< endl; } }; int main() { auto_ptr<Test> pt(new Test()); cout << "pt = " << pt << endl; // 0x7fffc05cee7 auto_ptr<Test> pt1(pt); // pt将不再指向的堆空间,由pt1来指向堆空间。此时pt为空 cout << "pt = " << pt << endl; // 0 cout << "pt1 = " << pt1 << endl; // 0x7fffc05cee70 pt1指向和原来pt指向相同的堆空间 return 0; }
STL库的智能指针:shared_ptr,weak_ptr,unique_ptr
1. 带有引用计数,支持多个指针指向同一片内存。
2. 配合shared_ptr使用。
3. 只能由一个指针指向一个内存空间,不能拷贝和构造。
QT(跨操作系统应用平台开发库)中的智能指针:Qpointe,QSharedPointer
Qpointer:
当其指向的对象空间被销毁时,指针自动置为空。(防止野指针,多次释放同一内存)
析构时不会自动销毁所指对象。(delect不会自动删除对应空间内存)
QSharedPointer:
引用计数型指针(创建时计数加一,销毁时减一),引用计数为0才删除指针对象。
有拷贝构造函数和赋值重载函数。
例:创建智能指针模板。
构造函数(初始化指针)。析构函数(删除指针指向的空间)。拷贝构造函数,赋值重载函数(一个空间只被一个指针指向)。
重载解指针,成员访问符(*,->)。不重载指针运算操作符(+,-)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string> #include "SmartPointer.h" // 自己创建的智能指针模板 using namespace std; class Test { string m_name; public: Test() { cout << "Test contructor" << endl; } ~Test() { cout << "Test destructor" << endl; } }; int main() { SmartPointer<Test> pt(new Test()); cout << "pt = " << pt.get() << endl; SmartPointer<Test> pt1(pt); cout << "pt = " << pt.get() << endl; cout << "pt1 = " << pt1.get() << endl; return 0; }