天天看點

智能指針的原理與模闆應用

智能指針概念及工程意義

智能指針實質上是一種能自動釋放堆空間的類對象,能避免記憶體洩露的問題。

實作原理

代碼實作

#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;
}

           

運作結果