自己实现智能指针
来源:互联网 发布:lms算法原理及推导 编辑:程序博客网 时间:2024/06/15 05:35
智能指针:实际指行为类似于指针的类对象 ,它的一种通用实现方法是采用引用计数的方法。
- 智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。
- 每次创建类的新对象时,初始化指针并将引用计数置为1;
- 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;
- 对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;这是因为左侧的指针指向了右侧指针所指向的对象,因此右指针所指向的对象的引用计数+1;
- 调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。
class Object{};class help{ //辅助类 friend class SmartPointer; help(Object *ptr) :hp(ptr), count(1) { cout << "begin to create help" << endl; }; ~help() { cout << "begin to delete share" << endl; delete hp; }; int count; Object *hp;};class SmartPointer{public: explicit SmartPointer(Object *p) :ptr(new help(p)) //不让隐式构造 { cout << "构造函数" << endl; } SmartPointer(const SmartPointer &rhs) { this->ptr = rhs.ptr; ++rhs.ptr->count; //引用计数加一 cout << "拷贝构造函数" << endl; } SmartPointer operator=(const SmartPointer &rhs) { cout << "重载=" << endl; ++rhs.ptr->count; //原引用计数加一 if (--this->ptr->count == 0) //现引用计数减一 { delete this->ptr; } this->ptr = rhs.ptr; return *this; } ~SmartPointer() { cout << "析构函数" << endl; if (--this->ptr->count == 0) { delete ptr; ptr = NULL; } }private: help *ptr;};int _tmain(int argc, _TCHAR* argv[]){// Object *op=new Object(); // SmartPointer p1=op; //构造(其实这样是错误的,因为智能指针本来只能使用直接初始化,这样的写法相当于将指针隐式转换,可能会造成两个指针同时指向一块内存而引用计数不增加) SmartPointer p1(new Object()); //将构造函数声明为explicit,避免上述情况发生,实际上shared_ptr的构造函数就是explicit SmartPointer p2(p1); //拷贝构造 SmartPointer p3=p2; //拷贝构造 p3 = p1; //重载等号 return 0;}
阅读全文
0 0
- 自己实现智能指针
- 自己实现一个C++ 智能指针
- 自己实现简单的智能指针
- 一个自己实现的简单的智能指针模板类
- 智能指针原理分析与自己的shared_ptr实现
- 自己设计C++智能指针
- 自己理解的智能指针
- C++ 智能指针实现
- 智能指针实现方式
- 手动实现智能指针
- 智能指针实现
- 智能指针初步实现
- 智能指针的实现
- 智能指针实现
- 面试实现智能指针
- 简单实现智能指针
- 智能指针实现
- c++智能指针实现
- JAVA 的ASCII字符编码一览表
- 2017 年 8 月:15 个有趣的 JS 和 CSS 库
- iOS之《Effective Objective-C 2.0》读书笔记(41)
- Build an IRC Server with Ircd Hybrid and Anope on Ubuntu 14.04
- servlet访问路径测试(path)
- 自己实现智能指针
- 检测文件mime类型和模糊哈希
- 一张图学会git命令
- codeforces433DIV2.(Sep 7th 2017)
- 关于epoll版服务器的理解(Python实现)
- 服务器增强版(TCP)
- 面试之STAR法则
- XML配置文件导入dtd文件仍然没有自动提示问题的解决
- linux 入门