前面我們介紹智慧型指標的時候,說了兩個智慧型指標分別是: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 第二個引數則...