浙江怎么制作网站,网站备案的要求是什么,ajax 效果网站,推广公司的套路Boost智能指针——shared_ptr
boost::scoped_ptr虽然简单易用#xff0c;但它不能共享所有权的特性却大大限制了其使用范围#xff0c;而boost::shared_ptr可以解决这一局限。顾名思义#xff0c;boost::shared_ptr是可以共享所有权的智能指针#xff0c;首先让我们通过一…Boost智能指针——shared_ptr
boost::scoped_ptr虽然简单易用但它不能共享所有权的特性却大大限制了其使用范围而boost::shared_ptr可以解决这一局限。顾名思义boost::shared_ptr是可以共享所有权的智能指针首先让我们通过一个例子看看它的基本用法
#include string #include iostream #include boost/shared_ptr.hpp class implementation { public: ~implementation() { std::cout destroying implementation\n; } void do_something() { std::cout did something\n; } }; void test() { boost::shared_ptrimplementation sp1(new implementation()); std::coutThe Sample now has sp1.use_count() references\n; boost::shared_ptrimplementation sp2 sp1; std::coutThe Sample now has sp2.use_count() references\n; sp1.reset(); std::coutAfter Reset sp1. The Sample now has sp2.use_count() references\n; sp2.reset(); std::coutAfter Reset sp2.\n; } void main() { test(); }
该程序的输出结果如下
The Sample now has 1 references The Sample now has 2 references After Reset sp1. The Sample now has 1 references destroying implementation After Reset sp2.
可以看到boost::shared_ptr指针sp1和sp2同时拥有了implementation对象的访问权限且当sp1和sp2都释放对该对象的所有权时其所管理的的对象的内存才被自动释放。在共享对象的访问权限同时也实现了其内存的自动管理。
boost::shared_ptr的内存管理机制
boost::shared_ptr的管理机制其实并不复杂就是对所管理的对象进行了引用计数当新增一个boost::shared_ptr对该对象进行管理时就将该对象的引用计数加一减少一个boost::shared_ptr对该对象进行管理时就将该对象的引用计数减一如果该对象的引用计数为0的时候说明没有任何指针对其管理才调用delete释放其所占的内存。
上面的那个例子可以的图示如下 sp1对implementation对象进行管理其引用计数为1 增加sp2对implementation对象进行管理其引用计数增加为2 sp1释放对implementation对象进行管理其引用计数变为1 sp2释放对implementation对象进行管理其引用计数变为0该对象被自动删除
boost::shared_ptr的特点
和前面介绍的boost::scoped_ptr相比boost::shared_ptr可以共享对象的所有权因此其使用范围基本上没有什么限制还是有一些需要遵循的使用规则下文中介绍自然也可以使用在stl的容器中。另外它还是线程安全的这点在多线程程序中也非常重要。
boost::shared_ptr的使用规则
boost::shared_ptr并不是绝对安全下面几条规则能使我们更加安全的使用boost::shared_ptr 避免对shared_ptr所管理的对象的直接内存管理操作以免造成该对象的重释放 shared_ptr并不能对循环引用的对象内存自动管理这点是其它各种引用计数管理内存方式的通病。 不要构造一个临时的shared_ptr作为函数的参数。 如下列代码则可能导致内存泄漏 void test() { foo(boost::shared_ptrimplementation(new implementation()),g()); } 正确的用法为 void test() { boost::shared_ptrimplementation sp (new implementation()); foo(sp,g()); }
转载https://blog.csdn.net/maweiqi/article/details/7889397?utm_sourcecopy