shared ptr 定製刪除器 和 迴圈引用

2021-07-30 12:38:32 字數 1978 閱讀 9481

前面我們介紹智慧型指標的時候,說了兩個智慧型指標分別是:auto_ptr和scoped_ptr,auto_ptr有問題,為此,scoped_ptr的出現解決了這個問題,scoped_ptr太霸道,不允許別人和他共用一塊記憶體空間,所以,我們還得想辦法解決這個問題。

回想我們以前看過內容,當提到共用一塊記憶體空間的時候,我們會想到什麼?

當然是深拷貝和淺拷貝了,最後我們是不是有給出了乙個寫時拷貝,就是通過引用計數的方法來實現共用一塊記憶體空間的。對於這個問題,c++中也給出了乙個相同方法的解決方案,這就是shared_ptr。

首先,我們還是模擬一下shared_ptr:

template

class sharedptr

}sharedptr(const sharedptr & sp)

~sharedptr()

}sharedptr& operator=(const sharedptr& sp)

}else

}return *this;

}t&operator*()

t*operator->()

private:

t* _ptr;

int * _pcount;

};

定製刪除器

#define _crt_secure_no_warnings 1

#include

using

namespace

std;

//為解決檔案指標

struct fclose

};//為解決malloc開闢的空間

template

struct free

};//一般情況下(使用new動態開闢的空間)

template

class delete

};template

class sharedptr

}sharedptr(const sharedptr& sp)//拷貝建構函式

:_ptr(sp._ptr)

, _pcount(sp._pcount)

}//sp1 = sp2

sharedptr& operator=(const sharedptr& sp)

return *this;

}//輔助函式

void release()

}//析構函式

~sharedptr()

int& getref()

private:

t* _ptr;

int* _pcount;

};void test2()

int main()

迴圈引用通過引用計數,我們解決了智慧型指標共享一塊空間的問題,不過,shared_ptr還是有點問題,那就是迴圈引用的問題,什麼是迴圈引用的問題呢?先來看乙個例子:

struct node  

; void funtest()

我們先定義乙個雙鏈表節點,然後,我們再建立兩個節點,並且讓其鏈結起來,之後,我們再想要釋放這兩個節點的時候,會發現乙個很有意思的現象,那就是,釋放sp1的時候,必須先釋放sp2,而想要釋放sp2,那麼必須先釋放sp1,這就是迴圈引用的例子。

如圖:

這是我畫的兩個節點,sp1的nest指向sp2,同時,sp2的prev指向sp1。那麼sp1所指向的記憶體就被兩個指標所管理,分別是:sp1和sp2->_prev;同樣的,sp2所指向的記憶體空間就會被sp2和sp1->_nest所管理。

如果現在想要釋放的是sp1,那麼釋放記憶體的時候其實是將其引用計數減去1,不是將這段空間釋放。

那麼,如何解決這個問題呢?

這裡就不得不說:weak_ptr 了。

定製刪除器

定製刪除器的產生 在實現智慧型指標的過程中,我們需要管理資料的構造以及析構,但不同的資料擁有不同的析構方式,例如檔案,new出來的空間等等,在利用模板程式設計中,我們需要識別不同的資料型別,然後選擇合適的刪除機制,做到一一對應。定製刪除器的實現利用了仿函式,如果你不知道仿函式的話,可以閱讀下面的一小...

c 定製刪除器

定製刪除器其實是利用仿函式 一 仿函式是什麼?不是函式但可以像函式一樣使用,因為過載了operator 簡單舉例 templatestruct less void test2 二 具體場景 void teat 上述場景中將產生錯誤,因為用fopen開啟,要用fclose關閉 三 定製刪除器舉例 如下...

C 定製刪除器

include include using namespace std template struct free 建立與malloc匹配的刪除器 template struct del 建立與new匹配的刪除器 struct fclose 建立與fopen匹配的刪除器 template 第二個引數則...