智能指针类模板
文章目錄
- 1 智能指針介紹
- 1.1 智能指針的意義
- 1.2 STL中的智能指針
- 2 創(chuàng)建智能指針類模板
1 智能指針介紹
1.1 智能指針的意義
智能指針具有如下意義:
- 現(xiàn)代C++開(kāi)發(fā)庫(kù)中最重要的類模板之一。
- C++中自動(dòng)內(nèi)存管理的主要手段。
- 能夠很大程度上避開(kāi)內(nèi)存相關(guān)的問(wèn)題。
1.2 STL中的智能指針
STL中的智能指針auto_ptr:
- 生命周期結(jié)束時(shí),銷毀指向的內(nèi)存空間。
- 不能指向堆數(shù)組,只能指向堆對(duì)象(變量)。
- 一片堆空間只屬于一個(gè)智能指針對(duì)象。
- 多個(gè)智能指針對(duì)象不能指向同一片堆空間。
編程實(shí)驗(yàn):auto_ptr使用初探
#include <iostream> #include <string> #include <memory>using namespace std;class Test {string m_name; public:Test(const char* name){cout << "Hello, " << name << "." << endl;m_name = name;}void print(){cout << "I'm " << m_name << "." << endl;}~Test(){cout << "Goodbye, " << m_name << "." << endl;} };int main() {auto_ptr<Test> pt(new Test("D.T.Software"));cout << "pt = " << pt.get() << endl;pt->print();cout << endl;auto_ptr<Test> pt1(pt);cout << "pt = " << pt.get() << endl;cout << "pt1 = " << pt1.get() << endl;pt1->print();return 0; }STL中的其它智能指針:
- shared_ptr:帶有引用計(jì)數(shù)機(jī)制,支持多個(gè)指針對(duì)象指向同一片內(nèi)存。
- weak_ptr:配合shared_ptr而引入的一種智能指針。
- unique_ptr:一個(gè)指針對(duì)象指向一片內(nèi)存空間,不能拷貝構(gòu)造和賦值。
2 創(chuàng)建智能指針類模板
SmartPointer.h:
#ifndef _SMARTPOINTER_H_ #define _SMARTPOINTER_H_template < typename T > class SmartPointer {T* mp; public:SmartPointer(T* p = NULL){mp = p;}SmartPointer(const SmartPointer<T>& obj) // 類內(nèi)實(shí)現(xiàn)不需要加<T>{mp = obj.mp;const_cast<SmartPointer<T>&>(obj).mp = NULL;}SmartPointer<T>& operator = (const SmartPointer<T>& obj){if( this != &obj ){delete mp;mp = obj.mp;const_cast<SmartPointer<T>&>(obj).mp = NULL;}return *this;}T* operator -> (){return mp;}T& operator * (){return *mp;}bool isNull(){return (mp == NULL);}T* get(){return mp;}~SmartPointer(){delete mp;} };#endifmain.cpp:
#include <iostream> #include <string> #include "SmartPointer.h"using namespace std;class Test {string m_name; public:Test(const char* name){cout << "Hello, " << name << "." << endl;m_name = name;}void print(){cout << "I'm " << m_name << "." << endl;}~Test(){cout << "Goodbye, " << m_name << "." << endl;} };int main() {SmartPointer<Test> pt(new Test("D.T.Software"));cout << "pt = " << pt.get() << endl;pt->print();cout << endl;SmartPointer<Test> pt1(pt);cout << "pt = " << pt.get() << endl;cout << "pt1 = " << pt1.get() << endl;pt1->print();return 0; }參考資料:
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 装修贷款可以贷几年
- 下一篇: 计数信号量的获取与释放