#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;
}

C++ shared_ptr deleter的实现的更多相关文章

  1. 智能指针之 shared_ptr

     std::shared_ptr 是通过指针保持对象共享所有权的智能指针.多个 shared_ptr 对象可占有同一对象大概实现了一下,主要实现原理为,共享指针内部持有堆资源 的指针以及引用计数的指针 ...

  2. C++11 新特性之智能指针(shared_ptr, unique_ptr, weak_ptr)

    这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr). shared_ptr shared_ptr 基本用法 shared_ ...

  3. [原] inline operator delete & DLL boundary

    很久以前写在百度空间的这篇文章: [百度空间] [原] 全局operator delete重载到DLL 首先,纠正一个词“重载”,operator new/delete是替换(replacement) ...

  4. C++:为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是?

    为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是? template <class T, class D = default_delete&l ...

  5. std::shared_ptr之deleter的巧妙应用

    本文由作者邹启文授权网易云社区发布. std::shared_ptr 一次创建,多处共享,通过引用计数控制生命周期. 实例 在邮箱大师PC版中,我们在实现搜索时,大致思路是这样的: 每一个账号都有一个 ...

  6. shared_ptr 和 unique_ptr

    c++11标准废除乐auto_ptr, C++ 标准库智能指针 使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项. unique_ptr 只允许基础指针的一个所有者. 除非你 ...

  7. shared_ptr<> reset

    // std_tr1__memory__shared_ptr_reset.cpp // compile with: /EHsc #include <memory> #include < ...

  8. std::shared_ptr(二)

    Defined in header <memory>       template< class T > class shared_ptr;   (since C++11)   ...

  9. C++动态内存管理之shared_ptr、unique_ptr

    C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...

随机推荐

  1. jqury.jqzoom插件--放大镜

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. Java线程与多线程教程

    本文由 ImportNew - liken 翻译自 Journaldev.   Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...

  3. 学习HTML5之塔克大战(详细记录)

    学了一些HTML5的一些基本知识,开始学习制作...... 介绍一些基本知识:  px(像素)--->1px等于多少? 1cm or 2cm -->no  no no! (1).像素是一个 ...

  4. Java 线程综述

    线程重在 线程同步和线程通信的编程 1.线程与进程?  线程是指程序在执行过程中,能够执行程序代码的一个执行单元.线程的状态:运行.就绪.挂起(suspend).结束; 进程是指一段正在执行的程序. ...

  5. display和visibility的区别

    一.display和visibility的相同与不同点 1.相同点:display和visibility都有讲元素隐藏的意思 2.不同点:display是元素隐藏,隐藏的元素不占文档流 而visibi ...

  6. thinking in java 之Reference类的使用

    Reference是java中的特殊引用类.描述的是特殊作用(主要是关于垃圾回收对象)的引用. 它有3个子类: 1.SoftReference; 2.WeakReference 3.PhantomRe ...

  7. 使用 JavaScript 修改浏览器 URL 地址栏

    现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...

  8. (DFS)hdoj1175:连连看

    题目链接 这道题被稍微改编当作过去年的期末上机题,也被直接放到了这次这一届的第二次练习赛.当初刚看到这道题时DFS并没有系统的学过,做起来极其费劲.现在学过之后开始实践练习,发现这道题真的是很水. 我 ...

  9. SGU 140 扩展欧几里得

    题目大意: 给定序列a[] , p , b 希望找到一个序列 x[] , 使a1*x1 + a2*x2 + ... + an*xn = b (mod p) 这里很容易写成 a1*x1 + a2*x2 ...

  10. SVN Unable to connect to a repository at URL

    方法一:右键菜单的“TortoiseSVN”->“Settings”->“Save Data”对话框中,点击“Authentication data”旁的“Clear”按钮,清除登录凭证. ...