用过c++朋友一定都忘记释放过动态分配的内存。内存释放是一个很头痛的问题,一不小心就会造成内存泄漏。比如说,一个函数中分配了内存,但这个函数还有很多出口(return),我们不得不在每个出口去释放内存。这是一个很费时费力的的工作。但如果用了智能指针,在函数结束时,会智能的释放内存。这节省了程序员的工作,也减少程序员犯错。

在mozilla开源项目里用到了智能指针nsAutoPtr和nsAutoArrayPtr(两个c++模板类)。这两个类会在类生命周期结束时释放所管理的内存。在代码中使用这类时,就不必担心内存释放。

AutoPtr:

Ptr是nsAutoPtr内部的类。注释说Ptr类阻止隐晦复制构造函数。

class Ptr

{

public:

Ptr(T* aPtr) : mPtr(aPtr)

{

}

operator T*() const

{

return mPtr;

}

private:

T* mPtr;

};

Ptr重载了隐式类转换,直接返回Ptr::mPtr成员值;

Ptr构造函数有一个参数,用于初始化Ptr::mPtr;

nsAutoPtr有三个构造函数。

nsAutoPtr的默认构造函数只将nsAutoPtr::mRawPtr初始化成0;

nsAutoPtr() : mRawPtr(0)

{

}

nsAutoPtr(Ptr aRawPtr) : mRawPtr(aRawPtr)

{

}

此构造函数使用Ptr类构造类初始化nsAutoPtr::mRawPtr指针。

nsAutoPtr(nsAutoPtr<T>& aSmartPtr)

: mRawPtr(a.SmartPtr.forget())

{

}

当使用智能指针A初始化另一个智能指针B时,被初始化的智能指针B将拥有智能指针B所管理的内存,而B将失败对内存管理。这个设计理由是,只有一个nsAutoPtr类管理这个内存。假设有两个nsAutoPtr A和b管理一个内存,当其中一个nsAutoPtr A生命周期结束,内存将被释放,那么B将指向一个非法内存地址。

nsAutoPtr<T>& operator=(T* rhs)

{

assign(rhs);

return *this;

}

此函数重载了右值为T* 的=运算符,nsAutoPtr首先释放原先管理内存,再管理rhs所指向内存。这避免泄漏原来管理的那内存。

nsAutoPtr<T>& operator=(nsAutoPtr& rhs)

{

assign(rhs.forget());

return *this;

}

此成员函数重载了右值为nsAutoPtr&的=运算符。 左值nsAutoPtr将释放管理的内存,再接管右值nsAutoPtr管理的内存。而右值nsAutoPtr将失去内存的管理权。这保证了这个内存只被一个nsAutoPtr管理。

operator T*() const

{

return get();

}

此函数重载了隐式类型转换。这主要是方便智能指针使用。例如 nsAutoPtr<int> a = new int; int * b = a;

b = a;这条语句不针产生编译错误,b 就是等于a的实例成员mRawPtr指向的内存。

T* operator->() const

{

NS_PRECONDITION(m_RawPtr != 0, “You can’t dereference a NULL nsAutoPtr with operator->(). ");

return get();

}

此成员函数重载->运算符。对nsAutoPtr<T> 类的操作转换成对T类型的操作。这也将方便nsAutoPtr的使用,就像是直接操作T类型的变量。

例如:

class A

{

public:

void FunctionA() {};

int nVa;

};

int main()

{

nsAutoPtr<A> a = new A;

a->FunctionA();

a->nVa;

return 0;

}

T& operator*() const

{

NS_PRECONDITION(mRawPtr != 0, “You can’t derefence a NULL nsAutoPtr width operator*().”);

return *get();

}

此函数重载了“*”运算。将对nsAutoPtr的运算转换成对nsAutoPtr<T>::mRawPtr的运算。

nsAutoPtr基本上对运算符都做了重载。将对自身的运算都转换到对成员T*的运算。这要在添加了nsAutoPtr的保护后,不会影响程序员的操作。而对nsAutoPtr<T>变量的操作,都写了另一些函数来实现, 这对nsAutoPtr<T>变量的操作是变麻烦了。但相对于带来的好处,这点麻烦还是承受的起的。

小弟只是肤浅了表达下自己的理解,希望多多指正,受教。

转载于:https://www.cnblogs.com/Mingxx/archive/2011/09/17/2179990.html

mozilla开源项目学习----智能指针(AutoPtrAutoArrayPtr)(上)相关推荐

  1. 借助开源项目学习软件开发_借助开源硬件,SparkFun继续创新

    借助开源项目学习软件开发 当SparkFun Electronics创始人兼首席执行官Nathan Seidle在科罗拉多大学攻读工程专业时,他被教导:"真正的工程师想出了一个主意,并为该主 ...

  2. 开源项目学习系列--02.天天酷音TTKMusicplayer

    开源项目学习系列--02.天天酷音TTKMusicplayer 1 简介 2 代码地址 3 基础知识 4 思路 5 代码分析 5.1 编译 5.2 参考 1 简介 天天酷音播放器,核心功能是采用基于 ...

  3. 关于IT8951 Tinydrm Driver开源项目学习的心得

    关于IT8951 Tinydrm Driver开源项目学习的心得 项目名称: julbouln/tinydrm_it8951 项目链接:https://github.com/julbouln/tiny ...

  4. GitHub 优秀的开源项目学习

    转载:原博客地址http://blog.csdn.net/shulianghan/article/details/18046021 一.ListView android-pulltorefresh 一 ...

  5. python开源项目新手_9月份Github上热门的Python开源项目

    9 月份 GitHub 上最热门的Python开源项目排行已经出炉啦,下面就是本月上榜的12个开源项目,一起来看看吧: 1. mlcourse.ai Star 6008 mlcourse.ai是Ope ...

  6. 开源项目哪家强?Github年终各大排行榜超级盘点(内附开源项目学习资源)

    整理 | Jane 出品 | AI科技大本营 [导语]提到开源项目,2018 年注定是不平凡的一年.据 Octoverse 报告数据,仅在 2018 年,Github 上的新用户就比过去六年的用户总数 ...

  7. 汇总 | 精选CVPR开源项目学习资源

    点击上方"视学算法",选择"星标" 干货第一时间送达 作者:Albert Lee https://zhuanlan.zhihu.com/p/142452685 ...

  8. 精选CVPR开源项目学习资源汇总

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1.Cvpr2020 Code CVPR 2020 论文开源项目合集 https://github.c ...

  9. 汇总|精选CVPR开源项目学习资源

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:Albert Lee https://zhuanlan.zhihu.com/p/14245268 ...

  10. github java开源项目经验_10月份Github上最热门的Java开源项目

    10 月份 GitHub 上最热门的Java开源项目排行已经出炉啦,在本月的名单中,实战项目类居多,当然也有像JavaGuide这样学习指南类项目,下面就是本月上榜的10个开源项目: 1.Java(S ...

最新文章

  1. 存在于实数域的微观粒子6-放射性衰变与分类准确率
  2. HDU3892(多项式域欧几里德算法)
  3. linux和信息资源管理,Linux top命令详解
  4. python gevent服务器_python gevent 协程
  5. 图像增强(一):randaugment
  6. 为系统加载右键注册控件选项【VB 注册控件】
  7. c语言二叉树层序遍历,二叉树二叉链表的层序遍历(C语言)
  8. Linux文件的基本属性
  9. 唐努乌梁海问题的由来
  10. 谷歌如何捕获街景中的门牌号码
  11. 成绩出来了!700 分也上不了清华,究竟该如何从内卷中走出来!肺腑之言,建议转发给亲戚朋友们!
  12. c++ 11 中显式默认设置的函数和已删除的函数 总结
  13. Linux服务器安装云锁
  14. 汇编指令学习(AND,OR,XOR,NOT)
  15. K-means方法总结(附代码)
  16. 天猫精灵如何和我们聊天?
  17. 外国人怎么样学计算机,适合外国人学中文的打字法
  18. Microsoft PlayReady DRM及其工作原理
  19. 羊毛党千亿产业链,信息安全何去何从?
  20. 人类智擒超高能中微子探秘宇宙黑洞

热门文章

  1. ab753变频器中文说明书_怎样快速学习使用和维修变频器
  2. Docker 更新版本
  3. 单位转换及格式化显示
  4. SQL Server启动的几种方法
  5. CSS3过渡、变形和动画
  6. Castle ActiveRecord学习实践(1)入门
  7. 转载:PLSQL中显示Cursor、隐示Cursor、动态Ref Cursor区别
  8. 深入浅出 Javascript API(二)--地图显示与基本操作
  9. 来教你用什么泡脚好,泡脚的好处有那些?
  10. vi 中插入当前时间