當前位置:
首頁 >
智能指针类模板
發布時間:2025/4/5
30
豆豆
文章目錄
- 1 智能指針介紹
- 1.1 智能指針的意義
- 1.2 STL中的智能指針
- 2 創建智能指針類模板
1 智能指針介紹
1.1 智能指針的意義
智能指針具有如下意義:
- 現代C++開發庫中最重要的類模板之一。
- C++中自動內存管理的主要手段。
- 能夠很大程度上避開內存相關的問題。
1.2 STL中的智能指針
STL中的智能指針auto_ptr:
- 生命周期結束時,銷毀指向的內存空間。
- 不能指向堆數組,只能指向堆對象(變量)。
- 一片堆空間只屬于一個智能指針對象。
- 多個智能指針對象不能指向同一片堆空間。
編程實驗: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:帶有引用計數機制,支持多個指針對象指向同一片內存。
- weak_ptr:配合shared_ptr而引入的一種智能指針。
- unique_ptr:一個指針對象指向一片內存空間,不能拷貝構造和賦值。
2 創建智能指針類模板
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) // 類內實現不需要加<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; }參考資料:
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 装修贷款可以贷几年
- 下一篇: 计数信号量的获取与释放