智能指針能夠自動釋放動態內存的指針。主要的機制就是用一個類來將指針包裹起來,然後在類的實例析構的時候自動釋放內存。
今天自己實現C++標準庫的傳統的auto_ptr智能指針。如果不是自己編寫的智能指針,運行時要加 -std=c++11選項,因爲c++11標準裏定義了智能指針。
#include <iostream>
using namespace std;
template<typename T> //用模板
class mauto_ptr{
T* ptr;//被包裹的真正的指針
public:
mauto_ptr(T *_ptr=NULL):ptr(_ptr){}
~mauto_ptr()
{
//核心功能
delete ptr;//釋放ptr指向的那塊內存
cout<<"mauto_ptr析構,釋放內存"<<endl;
}
//輔助功能,支持*ptr這種寫法
T operator*()
{
return *ptr;
}
//賦值運算符重載
mauto_ptr& operator=(mauto_ptr &r)
{
ptr=r.ptr;//將當前指針指向右值對象裏的指針指向的空間
r.ptr=NULL;//完後讓右值對象的指針爲空
return *this;
}
};
int main(void)
{
mauto_ptr<double> ptr(new double(3.14));
cout<<*ptr<<endl;
mauto_ptr<double> ptr1;
ptr1=ptr;
// cout<<*ptr<<endl; //舊的指針ptr1已經指向不了原來的空間,解NULL指針會發生斷錯誤
cout<<*ptr1<<endl;
//並沒有寫釋放內存的語句,會自動釋放
}
運行結果:
從結果可以看出,auto_ptr智能指針的作用是不需要用戶自己釋放內存,它是在自己的類的實例析構的時候自動釋放內存。