【數據結構實戰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;
}
};
}
智能指針的使用軍規
只能用來指向堆空間中的單個對象或者變量
小結
指針特徵操作符(-> *)可以被重載
重載指針特徵符能夠使用對象代替指針
智能指針只能用於指向堆空間中的內存
智能指針的意義在於最大程度的避免內存問題