C++实现具有基本功能的智能指针
C++中的智能指针实际上是代理模式与RAII的结合。
自定义unique_ptr,主要是release()和reset()。代码如下。
#include <iostream>
using namespace std;
template<typename T>
class my_unique_ptr {
public:
my_unique_ptr(T *p = 0): pointee(p) {};
~my_unique_ptr() {
delete pointee;
}
T &operator * () const {
return *pointee;
}
T *operator -> () const {
return pointee;
}
T *get() {
return pointee;
}
T *release() {
T *oldPointee = pointee;
pointee = 0;
return oldPointee;
}
void reset(T *p = 0) {
if(pointee != p) {
delete pointee;
pointee = p;
}
}
private:
my_unique_ptr(const my_unique_ptr<T> &rhs);
my_unique_ptr<T> &operator = (const my_unique_ptr<T> &rhs);
T *pointee;
};
struct C {
~C() {
cout << "destructor" << endl;
};
void print() {
cout << "print" << endl;
};
};
int main() {
my_unique_ptr<C> u1;
cout << u1.get() << endl; //0
my_unique_ptr<C> u2(new C());
u2->print(); //print
my_unique_ptr<C> u3(u2.release());
cout << u2.get() << endl; //0
u3->print(); //print
my_unique_ptr<C> u4;
u4.reset(u3.release());
cout << u3.get() << endl; //0
u4->print(); //print
return 0; //destructor
}
自定义shared_ptr,主要是引用计数,代码如下。
#include <iostream>
using namespace std;
template<typename T>
class my_shared_ptr {
public:
my_shared_ptr(T *p = 0): pointee(p), count(new size_t(0)) {
if(p) ++*count;
};
my_shared_ptr(const my_shared_ptr<T> &rhs): pointee(rhs.pointee), count(rhs.count) {
++*count;
}
my_shared_ptr<T> &operator = (const my_shared_ptr<T> &rhs) {
if(&rhs != this) {
decrease_count();
pointee = rhs.pointee;
count = rhs.count;
++*count;
}
return *this;
}
~my_shared_ptr() {
decrease_count();
}
size_t use_count() {
return *count;
}
T &operator * () const {
return *pointee;
}
T *operator -> () const {
return pointee;
}
private:
void decrease_count() {
if(--*count == 0) {
delete pointee;
delete count;
}
}
T *pointee;
size_t *count;
};
struct C {
~C() {
cout << "destructor" << endl;
};
void print() {
cout << "print" << endl;
};
};
int main() {
my_shared_ptr<C> p1;
cout << "p1: " << p1.use_count() << endl; //p1: 0
my_shared_ptr<C> p2(new C());
cout << "p2: " << p2.use_count() << endl; //p2: 1
my_shared_ptr<C> p3(p2);
cout << "p3: " << p3.use_count() << endl; //p3: 2
my_shared_ptr<C> p4 = p3;
cout << "p4: " << p4.use_count() << endl; //p4: 3
{
my_shared_ptr<C> p5(p4);
cout << "p5: " << p5.use_count() << endl; //p5: 4
}
cout << "p2: " << p2.use_count() << endl; //p2: 3
cout << "p3: " << p3.use_count() << endl; //p3: 3
cout << "p4: " << p4.use_count() << endl; //p4: 3
(*p4).print(); //print
p4->print(); //print
return 0; //destructor
}
C++实现具有基本功能的智能指针的更多相关文章
- Binder学习笔记(十一)—— 智能指针
轻量级指针 Binder的学习历程爬到驱动的半山腰明显感觉越来越陡峭,停下业务层的学习,补补基础层知识吧,这首当其冲的就是智能指针了,智能指针的影子在Android源码中随处可见.打开framewor ...
- C++ 11 智能指针 lamda 以及一个 围棋程序
lamda表达式使用 char* p = "Hello world"; ,nl = ; for_each(p,p+, [&](char i){ if(i=='e') ne+ ...
- Rust入坑指南:智能指针
在了解了Rust中的所有权.所有权借用.生命周期这些概念后,相信各位坑友对Rust已经有了比较深刻的认识了,今天又是一个连环坑,我们一起来把智能指针刨出来,一探究竟. 智能指针是Rust中一种特殊的数 ...
- 02 | 自己动手,实现C++的智能指针
第一步:针对单独类型的模板 为了完成智能指针首先第一步的想法. class shape_wrapper { public: explicit shape_wrapper( shape* ptr = n ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- c++ auto_ptr智能指针
c++ auto_ptr智能指针 该类型在头文件memory中,在程序的开通通过 #include<memory> 导入,接下来讲解该智能指针的作用和使用. 使用方法: auto_ptr& ...
- C++智能指针简单剖析
导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...
- [4] 智能指针boost::scoped_ptr
[1]boost::scoped_ptr简介 boost::scoped_ptr属于boost库,定义在namespace boost中,包含头文件#include <boost/scoped_ ...
- [6] 智能指针boost::weak_ptr
[1]boost::weak_ptr简介 boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include<boost/weak_ptr.hp ...
随机推荐
- Redis缓存服务搭建及实现数据读写--转载
来自 http://www.cnblogs.com/lc-chenlong/p/3218157.html 1. 下载安装Redis 下载地址:https://github.com/MSOpenTec ...
- html ajax 双引号的问题
"<a onClick='openwin_searchmodel()' href='searchmodel.action?projectname="+person[i].ge ...
- iOS开发——获取手机当前WiFi名和MAC地址
获取手机WiFi信息. iOS9以前的方法,还是能用,警告就警告吧!iOS9以后使用的是苹果最新的API框架,NetworkExtension/NEHotspotHelper.h,这个框架,第一次开放 ...
- (简单) POJ 3254 Corn Fields,状压DP。
Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; ...
- 多线程的并发问题,lock用法
开启多个线程,每个线程中多次操作公共变量 using System; using System.Collections.Generic; using System.Linq; using System ...
- IOS9任务管理器特效的实现
IOS9任务管理器特效的实现 IOS9中通过双击home键可以打开任务管理器,和以前版本不一样的地方时这这次使用的3D的特效,见下图: 那么如何在我们的APP中也制作出这样的特效呢?在GItHub上有 ...
- module_param()函数
1.定义模块参数的方法: module_param(name, type, perm); 其中,name:表示参数的名字; type:表示参数的类型; perm:表示参数的访问权限; ...
- 数据结构-String、char
String 常用方法: 获取长度:int length = strl.length() 获取第i个字符:char iChar = str.charAt(i) String转成字符数组:char[] ...
- Struts2验证
一.声明式验证 1.字段验证 fielderror的两种显示方式 fielderror的提示信息可以国际化 2.非字段验证:actionErrors / <s:actionerror> 例 ...
- 初学杂文 String类
String: 两个字符床 String stra 和String strb stra = "hello " ; strb = "hello " 在对象池中开 ...