【數據結構實戰C++】9 智能指針示例

【數據結構實戰C++】9 智能指針示例

作者 CodeAllen ,轉載請註明出處


內存泄漏問題(很多的bug都是因爲此)

  • -動態申請堆空間,用完後沒有釋放
  • -c++語言中沒有垃圾回收的機制
  • -指針無法控制所指堆空間的聲明週期

當代c++軟件中的智能指針(這三個條件都能滿足基本就可以避免)

  • -指針生命週期結束時主動釋放空間
  • -一片堆空間最多隻能由一個指標標識 (需要拷貝構造函數)
  • -杜絕指針運算和指針比較

智能指針的設計方案(原生的c++是沒有的,但是可以利用類模板)

  • -通過類模板描述指針的行爲
    能夠定義不同類型的指針對象
  • -重載指針特徵操作符(-> *)
    利用對象模擬原生指針的行爲

實驗:SmartPointer.cpp

#include <iostream>
#include "smartpoint.h"
using namespace std;
using namespace KKLib;
class Test
{
public:
    Test()
    {
        cout << "Test()" <<endl;
    }
    ~Test()
    {
        cout << "~Test()" <<endl;
    }
};
int main()
{
    SmartPointer<Test> sp = new Test();
    return 0;
}

SmartPointer.h

namespace KKLib
{
template <typename T>
class SmartPointer
{
protected:   //定義一個成員變量
    T* m_pointer;
public:
    SmartPointer(T* p = NULL)
    {
        m_pointer = p;
    }
    SmartPointer(const SmartPointer<T>& obj)
    {
        m_pointer = obj.m_pointer;
        const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
    }
    SmartPointer<T>& operator = (const SmartPointer<T>& obj)
    {
        if(this != &obj)
        {
            delete m_pointer;
            m_po  = obj.m_pointer;
            const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
        }
        return *this;
    }
    T* operator-> ()
    {
        return m_pointer;  //定製直接返回成員指針
    }
    T& operator* ()
    {
        return *m_pointer;
    }
    bool isNull()
    {
        return (m_pointer == NULL);
    }
    t* get()
    {
        return m_pointer;
    }
    ~SmartPointer()
    {
        delete m_pointer;
    }
};
}

智能指針的使用軍規
只能用來指向堆空間中的單個對象或者變量

小結
指針特徵操作符(-> *)可以被重載
重載指針特徵符能夠使用對象代替指針
智能指針只能用於指向堆空間中的內存
智能指針的意義在於最大程度的避免內存問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章