Chromium 智能指针实现
来源:互联网 发布:淘宝商品标题优化 编辑:程序博客网 时间:2024/06/05 06:54
出现智能指针的初衷?
C++ 没有虚拟机负责对象分配和释放的机制,需要程序员自己负责分配还是释放而手动释放会带来疏漏,因此就出现了能自动适当的对象的智能指针技术手段。
智能指针划分为两类。第一类智能指针引用的对象是可以共享的,也就是一个对象可以同时被多个智能指针引用。这类智能指针要求被引用的对象具有计数的功能,数值的大小就表示它目前被多少个智能指针引用。当一个对象的引用计数值等于0的时候,就表示它要被释放了。这类智能指针适合作为函数参数或者返回值在模块之间进行传递,从而实现共享。第二类智能指针不要求被引用对象具有计数的功能。
第二类智能指针引用的对象是独占的,也就是一个对象同一时刻只可以被一个智能指针引用。这类智能指针不要求被引用对象具有计数的功能。只要这类智能指针的生命周期超出了它自己的范围,那么它引用的对象就会被自动销毁。这类智能指针适合在函数或者内部使用,用来自动化释放那些不需要了的对象。此外,WebKit和Chromium还提供了弱智能指针。所谓弱智能指针,就是它们的存在不会影响到被引用对象的生命周期。它们适合用来解决对象之间存在循环引用时的释放问题。
- template<typename T>
- struct IsRefCounted {
- static const bool value = IsSubclass<T, RefCountedBase>::value
- || IsSubclass<T, ThreadSafeRefCountedBase>::value;
- };
Chromium的第一类智能指针由类scoped_refptr实现。由于它要求被引用对象具有计数功能,因此就提供了一个具有计数功能的基类RefCounted。当一个对象可以被类scoped_refptr描述的对象引用时,它就必须要从基类RefCounted继承下来。这一点与WebKit的第一类智能指针RefPtr是类似的。
Chromium的RefCounted类的实现如下所示:
- template <class T>
- class RefCounted : public subtle::RefCountedBase {
- public:
- RefCounted() {}
- void AddRef() const {
- subtle::RefCountedBase::AddRef();
- }
- void Release() const {
- if (subtle::RefCountedBase::Release()) {
- delete static_cast<const T*>(this);
- }
- }
- ......
- };
1.智能删除指针scoped_ptr
用作对普通指针的转储,防止忘记delete或不知道哪里delete。它跟引用计数没有关系。
头文件的注释就是使用示例
http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_ptr.h
template <class T, class D = base::DefaultDeleter<T> > class scoped_ptr
其中Deleter可以被替换,默认的Deleter区分是要delete普通指针还是指针数组,或者用free函数删除malloc的内存。
- Chromium 智能指针实现
- Chromium和WebKit的智能指针实现原理分析
- chromium源码阅读(2)-智能指针scoped_ptr
- boost智能指针及chromium指针管理WeakPtr
- boost智能指针及chromium指针管理WeakPtr
- Chromium的智能指针/引用计数/Callback/Bind
- C++ 智能指针实现
- 智能指针实现方式
- 手动实现智能指针
- 智能指针实现
- 智能指针初步实现
- 智能指针的实现
- 智能指针实现
- 面试实现智能指针
- 简单实现智能指针
- 智能指针实现
- c++智能指针实现
- 智能指针的实现
- SQL 日期时间格式的转换问题
- 第7周项目3- 负数把正数赶出队列
- OpenGL常用函数记录
- Win7 python安装pyquery chardet
- 详解JDBC与Hibernate区别
- Chromium 智能指针实现
- C#数组
- 10.9wannafly模拟赛
- git branch用法总结
- [技巧]go语言使用select{}产生随机数
- 中文分词常用方法简述
- golang进阶(三)——后台进程的启动和停止
- GridView上滑下拉出现数据错乱的问题
- em和rem 单位的使用