- 動態內存申請堆空間,用完後不歸還
- C++ 語言中沒有垃圾回收的機制
- 指針沒法控制所指堆空間的生命週期
- 指針生命週期結束時主動釋放堆空間
- 一片堆空間最多隻能由一個指針標識
- 杜絕指針運算和指針比較
經過類模板描述指針的行爲ios
- 可以定義不一樣類型的指針對象
重載指針特徵操做符
(-> 和 *)
編程
- 利用對象模擬原生指針的行爲
文件:SmartPointer.hthis
#ifndef SMARTPOINTER_H #define SMARTPOINTER_H namespace DTLib { template<typename T> class SmartPointer { public: SmartPointer(T *p = nullptr) { m_pointer = p; } SmartPointer(const SmartPointer &obj) { m_pointer = obj.m_pointer; const_cast<SmartPointer&>(obj).m_pointer = nullptr; } SmartPointer &operator = (const SmartPointer &obj) { if (this != &obj) { delete m_pointer; m_pointer = obj.m_pointer; const_cast<SmartPointer&>(obj).m_pointer = nullptr; } return *this; } T *operator -> () { return m_pointer; } T &operator * () { return *m_pointer; } bool isNull() { return (m_pointer == nullptr); } T *get() { return m_pointer; } ~SmartPointer() { delete m_pointer; } private: T *m_pointer = nullptr; }; } #endif // SMARTPOINTER_H
文件:main.cppspa
#include <iostream> #include "SmartPointer.h" using namespace std; using namespace DTLib; class Test { public: Test() { cout << "Test()" << endl; } ~Test() { cout << "~Test()" << endl; } void print() { cout << "void print() : " << value << endl; } private: int value = 10; }; int main() { SmartPointer<Test> p1 = new Test(); SmartPointer<Test> p2(p1); cout << "p1 = " << p1.isNull() << endl; cout << "p2 = " << p2.isNull() << endl; SmartPointer<Test> p3; p3 = p2; cout << "p2 = " << p2.isNull() << endl; cout << "p3 = " << p3.isNull() << endl; p3->print(); (*p3).print(); return 0; }
輸出:設計
Test() p1 = 1 p2 = 0 p2 = 1 p3 = 0 void print() : 10 void print() : 10 ~Test()
只能用來指向堆空間
中的單個
對象或者變量指針
- 指針特徵操做符 (-> 和 *) 能夠被重載
- 重載指針特徵符使用對象代替指針
智能指針只能用於指向堆空間中的內存
- 智能指針的意義在於最大程度的避免內存問題
以上內容整理於狄泰軟件學院系列課程,請你們保護原創!code