关键词:
承接两年前的这篇文章,心里有个梗总放不下。
这是一份old code,是我在更早之前(大概5年前左右)为了学习Android智能指针而做的探索,再不备份可能就面临着遗失的风险。
这份代码比较mini,也比较容易去验证一些特性、学习其内部实现原理。
一些要点说明:
1. 测试手段选择
如果在安卓环境下学习,需要有一份SDK环境和测试机器。这个对许多人想学习的人来说,可能操作起来有点复杂。
PC端模拟器方式可能是一个比较easy的方法,但我本人还没用过。
2. 跨平台化
软件的东西,可复用、跨平台是其优点,因此可以好好利用这个特性。我把安卓的智能指针进行了移植和改造,使其能在PC上比较容易编译和测试。
你只需包含一个头文件“RefBase.h”,并且需要管理的类继承于RefBase即可,例如下面的测试:
1 #define NO_DEBUG 0 2 #define VERBOSE_INFO 0 3 #define WARNING_INFO 1 // when ctor or dtor 4 #define ERROR_INFO 1 5 6 #include <iostream> 7 #include "include/RefBase.h" 8 9 using namespace std; 10 using namespace Rene; 11 12 class tmp : public RefBase 13 14 public: 15 tmp() 16 17 cout<<"tmp ctor"<<endl; 18 19 void printSth(void) 20 21 cout<<"hello,world"<<endl; 22 23 protected: 24 tmp(const tmp& other) 25 26 27 tmp(const tmp* other) 28 29 30 ~tmp() 31 32 cout<<"tmp dtor"<<endl; 33 34 35 virtual void onFirstRef(void) 36 37 cout<<"tmp onFirstRef"<<endl; 38 39 ; 40 41 void transfer_sp(sp<tmp> & spt) 42 43 sp<tmp> sp_tmp(spt); 44 sp_tmp.printRefs(); 45 46 47 void transfer_ptr(tmp * ptr) 48 49 sp<tmp> sp_tmp(ptr); 50 sp_tmp.printRefs(); 51 52 53 void transfer_obj(sp<tmp> obj) 54 55 sp<tmp> sp_tmp(obj); 56 sp_tmp.printRefs(); 57 58 59 int main() 60 61 tmp *pTmp = new tmp(); 62 cout<<"----------pTmp: "<<pTmp<<"------------"<<endl; 63 sp<tmp> spTmp(pTmp); 64 spTmp.printRefs(); 65 cout<<"----------spTmp: "<<&spTmp<<"------------"<<endl; 66 sp<tmp> sp1Tmp(pTmp); 67 spTmp.printRefs(); 68 spTmp->printSth(); 69 cout<<"----------sp1Tmp: "<<&sp1Tmp<<"------------"<<endl; 70 cout<<"------------ptr------------"<<endl; 71 transfer_ptr(pTmp); 72 cout<<"------------sp ref------------"<<endl; 73 transfer_sp(spTmp); 74 cout<<"------------sp obj------------"<<endl; 75 transfer_obj(spTmp); 76 cout<<"------------print refs------------"<<endl; 77 spTmp.printRefs(); 78 cout<<"------------------------"<<endl; 79 // sp<tmp> sp2Tmp(pTmp); 80 // spTmp.printRefs(); 81 // cout<<"-------------------------------"<<endl; 82 // sp<tmp> sp3Tmp(spTmp); 83 // spTmp.printRefs(); 84 // cout<<"-------------------------------"<<endl; 85 // sp<int> s; 86 // spTmp->printSth(); 87 88
3. 该mini code存在哪些问题?
由于具体实现都在.h中,编译时容易引起代码膨胀(预处理阶段,每个.cpp文件都会拷贝一份这个代码,导致生成的.o的size很大,最后bin文件也很大)。
而Android的实现是被编译到libutils.so库中,用只需引用这个(#include <utils/RefBase.h>)即可,生成的bin在运行时只需链接libutils库即可。
c++编程经验:智能指针--裸指针管得了的我要管,裸指针管不了的我更要管!(代码片段)
文章目录智能指针介绍手写智能指针不带引用计数的智能指针升级手写的智能指针智能指针的循环引用问题强智能指针弱智能指针弱智能指针升级为强智能指针多线程访问共享对象智能指针介绍智能指针是存储指向动态分配... 查看详情
c++编程经验:智能指针--裸指针管得了的我要管,裸指针管不了的我更要管!(代码片段)
文章目录智能指针介绍手写智能指针不带引用计数的智能指针升级手写的智能指针智能指针的循环引用问题强智能指针弱智能指针弱智能指针升级为强智能指针多线程访问共享对象智能指针介绍智能指针是存储指向动态分配... 查看详情
c++三种智能指针以及相关知识自写智能指针(代码片段)
传统指针存在的问题当我们在堆上创建了一个对象的时候,如果我们用完,系统并不会回收资源,必须我们手动来释放它如果我们没有处理好申请和释放的问题,那么可能造成内存泄漏的情况(没有释放/多次... 查看详情
c++智能指针(代码片段)
文章目录为什么需要智能指针?内存泄漏什么是内存泄漏,内存泄漏的危害内存泄漏分类如何检测内存泄漏(了解)如何避免内存泄漏智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::unique_ptrstd::shared_ptr定... 查看详情
c++智能指针(代码片段)
文章目录为什么需要智能指针?内存泄漏什么是内存泄漏,内存泄漏的危害内存泄漏分类如何检测内存泄漏(了解)如何避免内存泄漏智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::unique_ptrstd::shared_ptr定... 查看详情
c++智能指针(代码片段)
智能指针一、为什么需要智能指针?二、内存泄漏内存泄漏分类如何避免内存泄漏三、智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::unique_ptrstd::shared_ptr线程安全问题四、C++11和boost中智能指针的关系一、为什... 查看详情
c++智能指针(代码片段)
文章目录为什么需要智能指针?内存泄漏什么是内存泄漏,内存泄漏的危害内存泄漏分类(了解)如何避免内存泄漏智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrC++11和boost中智能指针的关... 查看详情
c++智能指针(代码片段)
C++四种智能指针为什么要有智能指针1、裸指针中可能存在的问题2、RAII思想(1)RAII原理(2)整个RAlI过程总结为四个步骤:3、C++内存泄漏(1)堆内存泄露(2)系统资源泄露什么是智能... 查看详情
c++智能指针(代码片段)
文章目录智能指针的使用及原理智能指针的使用智能指针的原理C++中的智能指针std::auto_ptrstd::unique_ptrstd::shared_ptrstd::shared_ptr的基本设计std::shared_ptr的线程安全问题std::shared_ptr的定制删除器std::weak_ptrstd::shared_ptr的循环引用... 查看详情
c++智能指针(代码片段)
文章目录智能指针的使用及原理智能指针的使用智能指针的原理C++中的智能指针std::auto_ptrstd::unique_ptrstd::shared_ptrstd::shared_ptr的基本设计std::shared_ptr的线程安全问题std::shared_ptr的定制删除器std::weak_ptrstd::shared_ptr的循环引用... 查看详情
[c++]智能指针(代码片段)
目录1.为什么需要智能指针?2.RAII(资源获取及初始化)2.1RAII方式的原理2.2重大问题2.3智能指针原理3.C++98auto_ptr(不要用)3.1解决浅拷贝的方式一3.2解决浅拷贝的方式二4.C++11unique_ptr4.1管理的资源多样如何释放4.2模拟实现5.C&... 查看详情
[c++]智能指针(代码片段)
目录1.为什么需要智能指针?2.RAII(资源获取及初始化)2.1RAII方式的原理2.2重大问题2.3智能指针原理3.C++98auto_ptr(不要用)3.1解决浅拷贝的方式一3.2解决浅拷贝的方式二4.C++11unique_ptr4.1管理的资源多样如何释放4.2模拟实现5.C&... 查看详情
这次肯定可以看懂c++智能指针,适合新手小白,c++内功修炼(代码片段)
小白学习C++智能指针智能指针的本质为什么要使用智能指针?智能指针的原理智能指针的类型auto_ptr特点缺陷unique_ptr功能实验share_ptr成员函数实例weak_ptrweak_ptr是什么weak_ptr如何使用weak_ptr模板类提供的成员方法参考资料... 查看详情
c++智能指针及循环引用(代码片段)
目录:auto_ptrunique_ptrshared_ptrweak_ptr循环引用问题智能指针的原理:智能指针的原理:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针指向的内存。智能指针本身是栈上... 查看详情
c++智能指针讲解及模拟实现(代码片段)
C++四种智能指针为什么要有智能指针1、裸指针中可能存在的问题2、RAII思想(1)RAII原理(2)整个RAlI过程总结为四个步骤:3、C++内存泄漏(1)堆内存泄露(2)系统资源泄露什么是智能... 查看详情
c++智能指针--所有的类型的解析(代码片段)
参考文献:C++智能指针简单剖析C++弱引用智能指针weak_ptr的用处关于shared_ptr与weak_ptr的使用1.智能指针背后的设计思想1.1无智能指针造成内存泄漏的例子voidremodel(std::string&str)std::string*ps=newstd::string(str);//堆内... 查看详情
shared_from_this(代码片段)
1.介绍关于智能指针shared_ptr很有意思的一个问题。可以用std::shared_ptr将裸指针封装起来,变成带引用计数的智能指针,当引用计数为0,C++会自动把裸指针指向的内存回收。先定义一个类classApublic:A();private:inta_;;这里p是裸指针,sp... 查看详情
c++进阶---智能指针(代码片段)
智能指针RAIIC++98的auto_ptrauto_ptr的使用auto_ptr模拟实现C++11的unique_ptr,shared_ptr,weak_ptrunique_ptrunique_ptr的使用unique_ptr的模拟实现shared_ptrshared_ptr的使用shared_ptr的模拟实现线程安全循环引用lambda+shared_p 查看详情