智能指針概念及工程意義
智能指針實質上是一種能自動釋放堆空間的類對象,能避免記憶體洩露的問題。
實作原理
代碼實作
#ifndef SMARTPOINTER_H
#define SMARTPOINTER_H
/**
*原理:堆棧空間的差別,當使用的指針生成對象時,在堆空間生成對象,需自己釋放空間,而智能指針是通過棧區生成對象,系統自動釋放。
*SmartPointer<type> obj = new type(); 沒有指針,是以自動釋放空間,type* p = new type() 在堆空間生成對象,不能自動釋放空間
*/
namespace BYLib //定義命名空間
{
template < typename T > //模闆操作,可以使指針使各種類型
class SmartPointer
{
T* m_pointer;
public:
SmartPointer(T* p = nullptr)
{
m_pointer = p;
}
SmartPointer(const SmartPointer<T>& obj)
{
m_pointer = obj.m_pointer;
const_cast<SmartPointer<T>&>(obj).m_pointer = nullptr;
}
SmartPointer<T>& operator = (const SmartPointer<T>& obj)
{
if(this != obj)
{
delete m_pointer;
m_pointer = obj.m_pointer;
const_cast<SmartPointer<T>&>(obj).m_pointer = nullptr;
}
return *this;
}
T& operator ->()
{
return *m_pointer;
}
bool isNULL()
{
return (m_pointer == nullptr);
}
T* operator *()
{
return m_pointer;
}
~SmartPointer()
{
delete m_pointer;
}
};
}
#endif // SMARTPOINTER_H
/*智能指針類的使用方式*/
#include <iostream>
#include "SmartPointer.h"
using namespace std;
using namespace BYLib;
class Text
{
public:
Text()
{
cout << "text()" << endl;
}
~Text()
{
cout << "~text()" << endl;
}
};
void test()
{
SmartPointer<Text> p = new Text();
SmartPointer<Text> p1 = p;
cout << p.isNULL() << endl;
cout << p1.isNULL() << endl;
}
int main()
{
test();
cout << "end" << endl;
return 0;
}