C++ shared_ptr deleter的实现
2015-09-21 13:05
441 查看
#include <iostream> #include <memory> using namespace std; #include<iostream> class sp_base{ public: virtual void del(void* obj) = 0; void inc_ref(){ ref_count_++; } void dec_ref(){ ref_count_--; } int ref_count()const{ return ref_count_; } private: int ref_count_ = 1; }; template<typename T, typename D> class sp_impl : public sp_base{ public: sp_impl(D d):d_(d){} void del(void* obj){ d_((T*)obj); } private: D d_; }; template<typename T> class default_del{ public: void operator()(T* obj){ std::cout << "sizeof (T) = " << sizeof(T) << std::endl; delete obj; } }; template<typename T> class sh_ptr{ public: template<class U> explicit sh_ptr(U* p){ obj = (T*)p; sp = new sp_impl<U, default_del<U>>(default_del<U>()); } template<class U, class D> sh_ptr(U* p, D del){ obj = (T*)p; sp = new sp_impl<U, D>(del); } sh_ptr(const sh_ptr& x){ obj = x.obj; sp = x.sp; sp->inc_ref(); } template <class U> sh_ptr(const sh_ptr<U>& x){ obj = (T*)x.obj; sp = x.sp; sp->inc_ref(); } ~sh_ptr(){ sp->dec_ref(); if(sp->ref_count() == 0){ sp->del(obj); } } private: T* obj; sp_base* sp; }; class Base{ public: Base(int b):m(b){} ~Base(){ std::cout << "deconctructor b" << std::endl; } private: int m; }; void delBase(Base* b){ delete b; } class delFunctor{ public: void operator()(Base* b){ delete b; } }; int main(){ { sh_ptr<Base> si = sh_ptr<Base>(new Base(5), delBase); sh_ptr<Base> si2 = sh_ptr<Base>(new Base(4), delFunctor()); sh_ptr<Base> si3 = sh_ptr<Base>(new Base(3), [](Base* b){delete b;}); } return 0; }
相关文章推荐
- STL - C++ 11的Lambda表达式(下)
- c语言编程:输入一个数看它是不是素数
- VC++下图形界面与非图形界面入口
- VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径
- 用c语言编写打印出100~200 之间的素数。
- 一段c++输入格式解析代码
- C++11:移动语义和完美转发
- 关于C++中如何判断文件,目录存在的若干方法
- C++ string自定义函数
- Item 32:确保public继承是"is a"的关系 Effective C++笔记
- 【C语言】用c编写乘法口诀表
- C和C++通用的头文件编写形式
- C语言 认识转换符 fscanf()用法
- C和C++混合编程(error C2059: syntax error : 'string')
- 综合出现NSScanner: nil string argument libc++abi.dylib: terminat错误的解决方案
- STL - C++ 11的Lambda表达式(上)
- C++——类实例化内存的分配和this指针的使用
- c++左值右值
- C++用string类写split方法
- C++的重载运算符