借用RAII思想妙用smartptr做异步程序内存自动回收

标题好奇怪啊,我的风格,啊哈哈哈哈哈,本着不写读书笔记,只记事件经验的想法写博客,刚刚度深入理解C指针忽然想到我在腾讯实习期间想到的一个对smatrptr的妙用,可以节省代码量以及后期维护产生内存泄露的可能。

RAII

RAII,在我的理解,就是一种让内存生命周期和其作用于的生命周期同步的一种自动释放机制,下面举一个例子:

 

然后代码就这样写:

 

在这之后代码就会不用显式的delete就能delete申请的内存了。

但是显然,要针对多个类型写多个RAII类或者模板写一个。

总之,很麻烦,于是出现了智能指针,铛铛铛铛~~

boost::scoped_ptr

boost是一个非常强大的C++库,本文提到的只是它的smartptr。

简单来说smartptr是智能指针,本身就是用来解决内存泄漏的问题的,大概原理是smartptr指向一个内存,内部对这个内存的计数器就会+1,当计数器为0时,最后一个指针的析构函数会自动调用delete。

boost中有几种具体的智能指针,使用最广泛的应该是shared_ptr

我在做一个高性能异步的服务器框架,正常情况下不会使用智能指针,任何时候用shared_ptr装入句柄指针,函数结束就会释放异步句柄,这是不可取的,我只是在最后需要释放句柄事件的时候需要引入RAII帮我释放句柄的堆内存。

因为纯粹是为了RAII释放,而不会有几个指针共享一个内存,所以我使用的是实现比shared_ptr更简单的scoped_ptr

使用场景

终于说到我的使用场景了,说了那么多,其实使用场景非常简单,就是在函数结束时无论如何都要释放掉一段内存的时候,异常分支很多,之后如果添加其他分支,也可能会忘记delete这段内存导致内存泄漏。

用代码举例子吧:

在上面这个函数被调用之前handle已经内申请好内存了,这个函数是异步程序的关闭回掉函数,需要释放内存,但中间异常分支会很多(虽然多半不会被执行到),此函数退出之后要保证所有内存都被释放,是使用智能指针来实现RAII自动释放内存的一个合适的场景。

其实也没什么特别的知识,就是实践中发现一个小的实用的省事的方法。

 

PS:智能指针还是要慎重使用的,不然当内存被自动释放了你还不知道。

 

引用:

http://blog.csdn.net/hunter8777/article/details/6327704

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.