1. 程式人生 > >C++智慧指標原理分析與簡單實現

C++智慧指標原理分析與簡單實現

一個簡單智慧指標實現的思路如下:

  智慧指標,簡單來講是使用引用計數的方法,來跟蹤監控指標。當引用計數為0時就delete 所跟蹤的目標指標,釋放記憶體
  智慧指標將一個指標封裝到一個類中,當呼叫智慧指標的拷貝建構函式時,將引用計數+1(因為新建立的智慧指標也引用了目標指標)
  過載智慧指標的賦值操作符,等號左邊的物件引用計數-1,右邊的物件引用計數+1,右邊的目標指標和引用計數賦值給左邊的物件
  智慧指標的解構函式將引用計數-1,並判斷是否為0,如果是的話delete 目標指標

示例如下(為方便測試,加入了輸出列印,已遮蔽):

template <class T>
class smart_ptr
{
private:
    T* ptr;
    int* count;
public:
    smart_ptr(T* p=0):ptr(p),count(new int(1))//構造時將引用計數初始化為1
    {
    }
    smart_ptr(const smart_ptr& src)//拷貝構造時引用計數+1
    {
        ++*src.count;
        count=src.count;
        ptr=src.ptr;
        //cout<<"after copy:count is "<<*count<<endl;
    }
    smart_ptr& operator=(const smart_ptr& src)//賦值時左邊物件引用計數+1,右邊物件引用計數-1
    {
        --*count;
        if(*count==0)//判斷計數是否為0,為0立即釋放記憶體
            delete ptr;
        count=src.count;
        ++*count;
        ptr=src.ptr;
        //if(count)cout<<"after fuzhi:count is"<<*count<<endl;
        //else cout<<"mem released"<<endl;
    }
    T* operator->()//過載指標的箭頭操作符
    {
        return ptr;
    }
    T& operator*()//過載指標的解引用操作符
    {
        return *ptr;
    }
    ~smart_ptr()//析構中引用計數-1,判斷計數是否為0,為0才釋放記憶體
    {
        --*count;
        if(*count==0)
        {
            delete ptr;
            delete count;
            ptr=NULL;
            count=NULL;
        }
        //if(count)cout<<"destructor:count is"<<*count<<endl;
        //else cout<<"mem released"<<endl;
    }
};

相關推薦

C++智慧指標原理分析簡單實現

一個簡單智慧指標實現的思路如下:   智慧指標,簡單來講是使用引用計數的方法,來跟蹤監控指標。當引用計數為0時就delete 所跟蹤的目標指標,釋放記憶體   智慧指標將一個指標封裝到一個類中,當呼叫

tomcat原理分析簡單實現

一、思路概述 1.tomcat實際是執行在jvm中的一個程序。我們把它定義為【中介軟體】,顧名思義,他是一個在java專案與jvm之間的 中間容器。我們的web專案沒有入口方法(main方法),那麼他是如何執行起來併為客戶端返回資料的呢? 2.web專案[就javaee而講]

智慧指標分析實現

一,為什麼要用智慧指標 在編寫c++程式的時候,讓我們最頭痛的問題就是記憶體洩露,也就是說 int* pt = new int; delete pt; 必須保證new和delete必須成對出現。作為程式猿,可以像使用普通變數一樣來使用指標,這個指標可以在恰當的時候被自動釋放,智慧指標

HashMap實現原理分析簡單實現一個HashMap

HashMap實現原理分析及簡單實現一個HashMap 歡迎關注作者部落格 簡書傳送門 轉載@原文地址   HashMap的工作原理是近年來常見的Java面試題。幾乎每個Java程式設計師都知道HashMap,都知道哪裡要用HashMap,知道HashMap和

機器學習系列文章:Apriori關聯規則分析演算法原理分析程式碼實現

1.關聯規則淺談     關聯規則(Association Rules)是反映一個事物與其他事物之間的相互依存性和關聯性,如果兩個或多個事物之間存在一定的關聯關係,那麼,其中一個事物就能通過其他事物預測到。關聯規則是資料探勘的一個重要技術,用於從大量資料中挖掘出有價值的資料

C++智慧指標shared_ptr講解使用

手動管理的弊端 在簡單的程式中,我們不大可能忘記釋放 new 出來的指標,但是隨著程式規模的增大,我們忘了 delete 的概率也隨之增大。在 C++ 中 new 出來的指標,賦值意味著引用的傳遞,當賦值運算子同時展現出“值拷貝”和“引用傳遞”兩種截然不同的語義

歸併排序演算法原理分析程式碼實現

  歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用,歸併排序將兩個已排序的表合併成一個表。 歸併排序基本原理

第五篇:樸素貝葉斯分類演算法原理分析程式碼實現

1 #==================================== 2 # 輸入: 3 # 空 4 # 輸出: 5 # postingList: 文件列表 6 # classVec: 分類標籤列表 7 #=

webpack-dev-server原理分析HMR實現

建議在github閱讀,我會保證內容及時更新,並歡迎star,issue。如果你想深入瞭解webpack-dev-server的內部原理,你也可以檢視我寫的這個打包工具,通過它可以完成三種打包方式,其中devServer模式就是通過webpack-dev-ser

Spring裝配基本屬性的原理分析程式碼實現

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins

c++智慧指標原理簡單實現

一、問題的引入 先看一段簡單的程式碼如下: #include<iostream> using namespace std; class Person { private: char *name ; public: Person() { cout<

[學習操練]C++智慧指標類的簡單實現(類模板實現

問題的提出 在使用指標的過程中,我們有時需要動態的分配指標,在c++中,我們推薦使用new分配記憶體,delete釋放記憶體。在編寫大型程式的時候,有時我們忘記delete分配的記憶體,或者多次釋放分配的記憶體,這樣會造成記憶體洩露和程式的down機。 解決方案 在程式開發中

c++智慧指標簡單實現

為了管理具有指標成員的類,必須定義三個拷貝控制成員函式:拷貝建構函式、operato=、解構函式。這些成員可以定義指標成員的指標型子行為或之行為。 智慧指標是行為類似於指標的的類物件,智慧指標在物件間共

C++智慧指標及其簡單實現

使用智慧指標的緣由   1. 考慮下邊的簡單程式碼: 1 int main() 2 { 3 int *ptr = new int(0); 4 return 0; 5 }    就如上邊程式,我們有可能一不小心就忘了釋放掉已不再使用的記憶體,從而導致

C++智慧指標簡單實現

#include <iostream> #include <string> #include <vector> #include <list> namespace smart_pointer { // RAII(Resou

C++ 智慧指標shared_ptr模板實現原理

C++ 智慧指標shared_ptr通過引用計數來管理指向的物件,不需要人工釋放 這篇博文主要是講解了智慧指標的實現原理,怎麼實現引用計數 #include <iostream> using namespace std; namespace shao_sma

[8]C++智慧指標簡單實現

智慧指標(smart pointer)是儲存指向動態分配(堆)物件指標的類,用於生存期控制,能夠確保自動正確的銷燬動態分配的物件,防止記憶體洩露。它的一種通用實現技術是使用引用計數(reference count)。智慧指標類將一個計數器與類指向的物件相關聯,引用計數跟蹤該

[C++]智慧指標原理使用

1、智慧指標的原理及作用         C++程式中不僅包含靜態記憶體和棧記憶體,還有一個記憶體池,記憶體池中的記憶體被稱為自由空間或者堆。程式通常使用堆來儲存動態分配的物件(程式執行時分配的物件),當動態物件不再被使用時,程式碼必須顯式的將它們銷燬。動態記憶體的管理是通

Apriori 關聯分析算法原理分析代碼實現

muc items blog 具體實現 itblog run 任務 name subset 轉自穆晨 閱讀目錄 前言 關聯分析領域的一些概念 Apriori算法基本原理 頻繁項集檢索實現思路與實現代碼 關聯規則學習實現思路與實現代碼 小結 回到頂部 前言

K-Means 聚類算法原理分析代碼實現

oat 得到 ssi targe fan readline txt __name__ 輸出 轉自穆晨 閱讀目錄 前言 現實中的聚類分析問題 - 總統大選 K-Means 聚類算法 K-Means性能優化 二分K-Means算法 小結 回到頂部 前言 在