最近使用boost的智能指针,查看了一些帖子。总结如下:
智能指针分类:http://developer.51cto.com/art/201012/239004.htm
智能指针使用注意事项:http://blog.sina.com.cn/s/blog_45497dfa0101egbu.html
多线程安全性分析:http://blog.csdn.net/jiangfuqiang/article/details/8292906
http://my.oschina.net/costaxu/blog/103119 (这个帖子的结论很好,
1 shared_ptr是一个非常实用的智能指针。
2 shared_ptr的实现机制是在拷贝构造时使用同一份引用计数。
3 对同一个shared_ptr的写操作不是线程安全的。 对使用同一份引用计数的不同shared_ptr是线程安全的。
)
封装有基类、子类的智能指针类型转换:http://blog.csdn.net/bopzhou/article/details/6748763
http://blog.csdn.net/clever101/article/details/6950050
经过几天的试用,最终决定放弃在系统中使用boost::shared_ptr<T>.原因如下:
1.因为boost::shared_ptr<T>是以boost::shared_ptr<T>(T* p)建立智能指针,调用两次就会生成对于T* p的两个引用计数,比较危险。
2.总有情况需要将类内使用boost::shared_ptr<T>保存的对象取出,如果返回指针,出现情况1.如果返回boost::shared_ptr<T>引用,又存在A是T的子类,boost::shared_ptr<T>和boost::shared_ptr<A>互转的情况,很麻烦,而且处理不好很容易出错,对于使用系统的用户使用是个很不好的选择。
3.总有情况是对象要返回自身的智能指针(以this参数)。这时会返回boost::shared_ptr<Edge>(this),结果依据第一个原因,这种情况一定会生成两个计数,也就一定会出错。
所以boost::shared_ptr<T>这种非插入式(辅助式)只适合小范围、局部使用。插入式(句柄)指针才适合系统使用(上些大型的c++开源库,如vtk/osg均使用此方法)。