智能指针类模板
智能指针的意义
1、现代C++开发库中最重要的类模板之一
2、C++中自动内存管理的主要手段;
3、能够在很大程度上避开内存相关的问题。
STL中的智能指针auto_ptr
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;
}
STL中的其他智能指针
1、shared_ptr:带有引用计数机制,支持多个指针对象指向同一片内存;
2、werk_ptr:配合shared_ptr而引入的一种智能指针;
3、unique_ptr:一个指针对象指向一片内存空间,不能拷贝和赋值。
QT中的智能指针
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;
}
}
#endif
小结
1、智能指针C++中的自动内存管理的主要手段;
2、智能指针在各个平台上都有不同的表现形式;
3、智能指针能够尽可能的避免内存相关的问题;
4、STL和Qt中都有提供了对智能指针的支持。