C++ shared_ptr deleter的实现

时间:2022-09-21 12:02:40
#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&lowbar;ptr

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

  2. C&plus;&plus;11 新特性之智能指针(shared&lowbar;ptr&comma; unique&lowbar;ptr&comma; weak&lowbar;ptr&rpar;

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

  3. &lbrack;原&rsqb; inline operator delete &amp&semi; DLL boundary

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

  4. C&plus;&plus;:为什么unique&lowbar;ptr的Deleter是模板类型参数,而shared&lowbar;ptr的Deleter不是?

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

  5. std&colon;&colon;shared&lowbar;ptr之deleter的巧妙应用

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

  6. shared&lowbar;ptr 和 unique&lowbar;ptr

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

  7. shared&lowbar;ptr&lt&semi;&gt&semi; reset

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

  8. std&colon;&colon;shared&lowbar;ptr&lpar;二&rpar;

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

  9. C&plus;&plus;动态内存管理之shared&lowbar;ptr、unique&lowbar;ptr

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

随机推荐

  1. 【题解】【数组】【查找】【Leetcode】Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  2. &lbrack;GRYZ2015&rsqb;快排练习

    用快排完成n(n<=100)个人年龄的从小到大的排序,要求出生年相同的按月排. 输入:第一行n个人 2到n+1行出生  年  月(1992 9) 输出:年龄的从小到大的排序. type ss=r ...

  3. 17&period;1&period;1&period;5 Creating a Data Snapshot Using mysqldump

    一种方式创建一个数据库的快照在一个存在的master 数据库是使用mysqldump 来创建你需要复制的所有数据库的dump. 一旦数据dump 是完成,你然后倒入数据到slave 在开始复制过程前 ...

  4. linux网口绑定笔记-bind

    模式0:balance-rr 模式1:active-backup 模式2:balance-xor 模式3:broadcast 模式4:802.3ad 模式5:balance-tlb 模式6:balan ...

  5. es6箭头函数讲解

    es6箭头函数的用法 箭头函数是es6的一种函数的简写方法. 如下: var f = v = > v; //等同于 var f = function(v){ return v; } var su ...

  6. 【网络】 数据链路层&amp&semi;物理层笔记

    数据链路层 简称链路层,功能在于将数据包封装成帧,控制帧对介质的访问.链路层连接了物理介质和其之上抽象层,可以使上层不用关心用什么方法在什么介质中传输信息. 在帧被传输时经过的每一跳,每个中间设备(通 ...

  7. leetcode刷题11&period; 盛最多水的容器

    做题连接https://leetcode-cn.com/problems/container-with-most-water/submissions/ 本题分为两种方法: 暴力法: int maxAr ...

  8. day21 xml模块 ATM&plus;购物车

    1. xml模块 <father name="jack"> # 属性的值必须加双引号 <son> 标签的关闭顺序,与开启顺序相反, 最先开启的最后关闭,最后 ...

  9. 转)VCSA 6&period;5重启无法访问,报错&OpenCurlyDoubleQuote;503 Service Unavailable”的解决方法

    1. 问题 重启vcenter,登陆vsphere client,提示 “503 Service Unavailable (Failed to connect to endpoint: [N7Vmac ...

  10. CentOS 7 Apache服务的安装与配置

    原文出处:http://blog.51cto.com/13525470/2070375 一.Apache简介 Apache 是一个知名的开源Web服务器.早期的Apache服务器由Apache Gro ...