淺析shared_ptr 和weak_ptr、定製刪除器
阿新 • • 發佈:2019-02-14
通過boost::weak_ptr來打破迴圈引用 ,由於弱引用不更改引用計數,類似普通指標,只要把迴圈引用的一方使用弱引用,即可解除迴圈引用
定製刪除器;
定製刪除器;
定製刪除器 為什麼在shared_ptr中介紹刪除器呢?(因為auto_ptr存在缺陷,scoped_ptr功能不全) #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <memory> using namespace std; // 定置的刪除器仿函式 template<class T>//注意這裡有模版 struct Del { void operator()(const T* ptr) { delete ptr; cout << "delete" << endl; } }; struct Free//注意這裡沒有模版 { void operator()(void* ptr) { free(ptr); cout << "free" << endl; } }; struct Fclose { void operator()(void* ptr) { fclose((FILE*)ptr); cout << "fclose" << endl; } }; template<class T, class Deleter = Del<T>> class SharedPtr { public: SharedPtr(T* ptr, Deleter del) :_ptr(ptr) , _pCount(new long(1)) , _del(del) {} SharedPtr(T* ptr) :_ptr(ptr) , _pCount(new long(1)) {} ~SharedPtr() { _Release(); } protected: void _Release() { if (--*_pCount == 0) { _del(_ptr); delete _pCount; } } private: T* _ptr; long* _pCount; Deleter _del; }; void Test() { // 定製刪除器 SharedPtr<int> p1(new int(1)); // 定製刪除器和分配器 SharedPtr<int, Free>sp2((int*)malloc(sizeof(int)* 10), Free()); } int main() { Test(); system("pause"); return 0; }