c++之智能指针
来源:互联网 发布:js typeof5类型 编辑:程序博客网 时间:2024/05/18 01:56
什么是智能指针呢?
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。
智能指针是RAII的一种应用!
RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象。
智能指针的作用:
1:智能管理指针的释放
2:能够像指针一样使用
3:能完成正常的赋值拷贝
智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。
常见的智能指针:
(1)auto_ptr 管理权转移,带有缺陷的设计,会释放一个空间多次,尽量不要使用它。(c++98/c++03)
(2)scoped_ptr 防拷贝,高效,简洁。不需要拷贝/赋值的时候使用。(boost库)
(3)share_ptr 共享(引用计数)管理,支持赋值/拷贝。缺陷是循环引用(weak_ptr).(boost库)
(4)weak_ptr 赋值share_ptr 解决循环引用,不增加引用计数。(boost库)
#pragma once//模拟实现智能指针 基于引用计数的智能指针template <class T>class SmartPointer{public: //构造 SmartPointer(T* p = 0) :_ptr(p) , _count(new size_t) { if (p) *_count = 1; else *_count = 0; } //拷贝构造 SmartPointer(const SmartPointer& s) { if (this != &s) { _ptr = s._ptr; _count = s._count; (*_count)++; } } //重载赋值 SmartPointer<T>& operator=(const SmartPointer<T>& s) { if (_ptr == s._ptr) { return *this; } ReleaseCout(); _ptr = s._ptr; _count = s._count; (*_count)++; return *this; } //重载操作符* T& operator*() { if(ptr) return *_ptr; } //重载操作符-> T* operator->() { if (ptr) return _ptr; } //析构函数 ~SmartPointer() { if (--(*_count) == 0) { delete _ptr; delete _count; _ptr = NULL; _count = NULL; } }private: T* _ptr; size_t* _count; void ReleaseCout() { if (_ptr) { (*_count--); if ((*_count) == 0) { delete _ptr; delete _count; _ptr = NULL; _count = NULL; } } }};void test(){ SmartPointer<char> p1(new char('a')); SmartPointer<char> p2(p1); SmartPointer<char> p3; p3 = p2; p3 = p1; p3 = p3;}
阅读全文
0 0
- C++:智能指针之shared_ptr
- c++:智能指针
- C++:智能指针
- 【C++】智能指针
- 【C++】智能指针
- C++PJ智能指针
- 【c++】智能指针
- 【C++】智能指针auto_ptr
- C++,智能指针
- C++,boost智能指针
- 智能指针模拟C
- [C++]智能指针
- 【C++】 浅析智能指针
- C++_智能指针
- C++:初识智能指针
- C++::智能指针
- 【C++】智能指针
- c智能指针:unique_ptr
- JFinal -spring整合的代码
- spark maxResultSize
- 基于easyui利用poi技术实现导出,导入,导出text功能
- 5.常见概念和问题
- Unity5.6大规模地形—地形资源的创建(2)
- c++之智能指针
- 手机变身高清摄像头 DroidCamX完全使用教程
- 第十二单元练习题
- Oracle 12C 新特性之 PDB热克隆(本地克隆、远端异机克隆)
- 冒泡排序--对数组中的元素进行降序排列
- MFC使用定时器
- gensim词袋向量化
- RESTful Web 服务
- Web环境使用相对路径发布Webservice