C++智能指针原理
2015-09-03 15:08
429 查看
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。
智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。
智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。
#include<iostream> using namespace std; template <typename T> class SmartPointer { public: //构造函数 SmartPointer(T* p=0): _ptr(p), _reference_count(new size_t) { if(p) *_reference_count = 1; else *_reference_count = 0; } //拷贝构造函数 SmartPointer(const SmartPointer& src) { if(this!=&src) { _ptr = src._ptr; _reference_count = src._reference_count; (*_reference_count)++; } } //重载赋值操作符 SmartPointer& operator=(const SmartPointer& src) { if(_ptr==src._ptr) { return *this; } releaseCount(); _ptr = src._ptr; _reference_count = src._reference_count; (*_reference_count)++; return *this; } //重载操作符 T& operator*() { if(*_ptr) { return *_ptr; } //throw exception } //重载操作符 T* operator->() { if(ptr) { return _ptr; } //throw exception } //析构函数 ~SmartPointer() { if (--(*_reference_count) == 0) { delete _ptr; delete _reference_count; } } private: T *_ptr; size_t *_reference_count; void releaseCount() { if(_ptr) { (*_reference_count)--; if((*_reference_count)==0) { delete _ptr; delete _reference_count; } } } }; int main() { SmartPointer<char> cp1(new char('a')); SmartPointer<char> cp2(cp1); SmartPointer<char> cp3; cp3 = cp2; cp3 = cp1; cp3 = cp3; SmartPointer<char> cp4(new char('b')); cp3 = cp4; cout<<*cp3<<" "<<*cp4<<endl; return 0; }
相关文章推荐
- C++之随笔(一)
- POJ C++程序设计 编程题#4 字符串操作
- twoSum(C++)
- 【more effective c++读书笔记】【第5章】技术(2)——限制某个class所能产生的对象数量
- 【more effective c++读书笔记】【第5章】技术(2)——限制某个class所能产生的对象数量
- c++STL容器
- C语言访问MCU寄存器的三种方式
- 【模板】c++ template模板实现string到Num的转换
- C++中泛型算法
- C语言实现冒泡排序-整数排序
- 【C/C++学院】0730-网站以及后门/结构体对齐、结构体面试分析/深拷贝与浅拷贝/队列/字符串封装
- C语言链表中数组实现数据选择排序,升序、降序功能主要难点
- C语言链表中数组实现数据选择排序,升序、降序功能主要难点
- C++中构造函数和析构函数的调用顺序
- C++面向对象编程
- C++ 静态成员的类内初始化
- C语言实现链式队列
- C++标准库set类型
- c++ primer读书笔记之c++11(二)
- C语言的日期和时间库