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时对象已经被释放了,所以我被坑了一下,因为之前单层调用的时候都没出错,所以这个错误就不好找出来。

经验:

  1. 当你对一个东西懂一点,但是没完全吃透的时候,不去吃透,而是修修补补能运行就行,这样非常容易走大弯路,要养成看源码的习惯。
  2. 当有智能指针这种管理内存的方法时,就不要用对象指针了,因为这样会很容易出错,终于理解了别人说的一句话,“c++中出现了指针就不是好的c++代码”。
  3. 还是太浮躁,浮躁。

0 0
原创粉丝点击