itk smartpoint 以及内存管理研究
来源:互联网 发布:一夫多妻 知乎 编辑:程序博客网 时间:2024/06/16 08:07
对itk中的内存如何管理一直都是模模糊糊,用的都是只能指针,感觉很像cocos中的内存管理。但是由于自己的程序经常要对一段很大的连续内存进行分配和释放,导致老是内存分配失败,是要好好研究一下了。
看了源码,才发现,内存管理就是用智能指针和引用计数来实现的。
class object{public:void register(){++m_reference;}void unRefister(){if(!(--m_reference))delete this;}private:int m_reference;}template <T>class smartPoint<T>{public:typedef smartPoint<T> selfvoid register(){m_point->register();}void unRefister(){m_point->unRegister();}void operator =(self& right);private:m_point;}
简化起来大概就是这样,smartPoint负责把对象(指针)封装起来,可以完全把smartpoint当作局部变量来使用,。外部释放对a的引用时,引用计数就会减一,反之加一。外部有引用对象a的时候,a的引用计数就不会为0,这样使用者就不用操心对象的释放问题了。
没清晰理解这个之前,犯了一个很低级的错误,导致出现了莫名其妙的错误。
smartPoint<object> getObject(){return object::New();}在使用这个函数时,New()是个工厂函数,返回的是smartpoint,但是如果我在返回的时候赋给一个object*类型呢?由于smartPoint可以直接类型转换为object*(构造函数中只有一个参数时,可以默认转化类型),而smartPoint和Object*在代码书写和使用上没任何差别,所以在一层调用关系上不会出错,但是在2层调用关系中就会出错。比如:
object* getObject(){return object::New();}object* getObject2(){return getObject();}int main(){auto obj = getObject2();obj->getElement();return 0;}当main中使用obj时对象已经被释放了,所以我被坑了一下,因为之前单层调用的时候都没出错,所以这个错误就不好找出来。
经验:
- 当你对一个东西懂一点,但是没完全吃透的时候,不去吃透,而是修修补补能运行就行,这样非常容易走大弯路,要养成看源码的习惯。
- 当有智能指针这种管理内存的方法时,就不要用对象指针了,因为这样会很容易出错,终于理解了别人说的一句话,“c++中出现了指针就不是好的c++代码”。
- 还是太浮躁,浮躁。
0 0
- itk smartpoint 以及内存管理研究
- 内存管理深入研究
- Java 内存管理研究
- Cocos2d-X内存管理研究
- Cocos2d-X内存管理研究
- Cocos2d-x内存管理研究
- 内存管理以及分配
- java内存管理以及GC
- Linux内存空间以及内存管理
- C++ 内存管理 以及 进阶
- 内存管理基本概念之:碎片研究
- 嵌入式系统内存管理方案研究
- 嵌入式系统内存管理方案研究
- Delphi7 内存管理及 FastMM 研究
- Delphi7 内存管理及 FastMM 研究
- Delphi7 内存管理及 FastMM 研究[转]
- cocos2d-x 引擎代码研究 --- 内存 管理
- linux内核研究-7-内存管理
- openfire 安装测试
- iOS之layoutSubView的使用
- Android中自定义View的MeasureSpec使用
- The JSP specification requires that an attribute name is preceded by whitespace
- MySql配置信息的详解
- itk smartpoint 以及内存管理研究
- 信号量CSemaphore的使用
- 海思3531芯片资料汇总--转载
- java日志-各种日志框架使用讲解-***
- 6个流行的直线提取算法——基于2D测距数据(摘自自主移动机器人导论)
- bash(详解)
- spi 上拉下拉
- Codeforces Round #286 (Div. 2) C题 Mr. Kitayuta, the Treasure Hunter (DFS+记忆化DP)
- 微软发布Windows 10:连Windows 7都能免费升级了