C++运算符重载(10) - 智能指针
来源:互联网 发布:淘宝网咖啡机 编辑:程序博客网 时间:2024/06/05 21:04
下面是一个使用普通指针的简单例子:
MyClass *ptr = new MyClass();
ptr->doSomething(); //必须手动释放ptr,避免内存泄漏
MyClass *ptr = new MyClass();
ptr->doSomething(); //必须手动释放ptr,避免内存泄漏
使用智能指针,则不需要显式地调用delete去释放。智能指针是一个基于指针的类,重载了操作符*和->。智能指针的对象看起来像指针,但是可以做很多普通指针所不能的事情,例如自动析构(不需要显式使用delete),引用计数等。
总的方法是实现一个类,包含成员指针,析构函数以及重载操作符*和->。因为析构函数会在对象结束时自动调用,所以动态分配的资源可以被自动的delete(或者是引用计数自减)。
参考下面的例子:
20
#include<iostream>using namespace std; class SmartPtr{ int *ptr; // 实际的指针public: // 使用了explicit关键字的构造函数 explicit SmartPtr(int *p = NULL) { ptr = p; } // 析构函数 ~SmartPtr() { delete(ptr); } // 重载解引用操作符 int &operator *() { return *ptr; }};int main(){ SmartPtr ptr(new int()); *ptr = 20; cout << *ptr; // 这里无需调用delete ptr。 // 当对象ptr的生命周期结束时,会自动调用析构函数来delete ptr。 return 0;}输出:
20
对所有类型都通用的智能指针.
可以使用模板来实现一个通用的智能指针。如下面例子所示。
#include<iostream>using namespace std; // 一个通用的智能指针类template <class T>class SmartPtr{ T *ptr; // 实际的指针public: // 构造函数 explicit SmartPtr(T *p = NULL) { ptr = p; } // 析构函数 ~SmartPtr() { delete(ptr); } // 重载解引用运算符 T & operator * () { return *ptr; } // 重载箭头操作符,这样所有的T成员都能像指针一样访问。 // (当T是一个类或结构体或union时很有用) T * operator -> () { return ptr; }};int main(){ SmartPtr<int> ptr(new int()); *ptr = 20; cout << *ptr; return 0;}输出:
20
智能指针可以很方便的用于资源管理,例如文件句柄,或网络sockets.
C++库中提供了这些智能指针auto_ptr, unique_ptr, shared_ptr and weak_ptr.
引用:
http://en.wikipedia.org/wiki/Smart_pointer
0 0
- C++运算符重载(10) - 智能指针
- C/C++:智能指针原理(运算符重载)、使用auto_ptr<A>
- *运算符,->运算符重载与智能指针
- c++学习笔记之运算符重载与智能指针
- 重载指针运算符
- 有效的使用和设计COM智能指针——条款17:重载运算符时应当符合C/C++约定
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- C++--------------------------------------------运算符重载
- C#:运算符重载
- C++:运算符重载
- C++:运算符重载
- XP 安装后使用vc2010,进入类视图后,点击一个函数,后vs报错退出问题
- Visual Leak Detector检测内存泄露
- 黑马程序员——java的基础概述
- linux命令行大全
- Tomcat的目录结构详解
- C++运算符重载(10) - 智能指针
- 02-线性结构2. Reversing Linked List (25)
- ACM-1的个数
- hibernate 注解配置一对多关系简单实例
- 浅谈java学习--针对JAVA初学者的建议
- 背包整理模板
- [前端] JS实现文件下载
- Fedora10虚拟机上网:桥接方式
- iOS 7使用boundingRectWithSize