2013/10/24初学BOOST

今天第一次接触学习boost库,虽然以前也听过boost,但是没有用心学习和使用此库。

学习的材料是:Boost_c++库.pdf

RAII

智能指针的原理基于一个常见的习语叫做RAII:资源申请即初始化。智能指针只是这个习语的其中一例--当然是相当重要的一例。智能指针的内存都能得到正确的释放,从而将开发人员从这项任务中解放出来。这宝库程序因为异常而中断,原本来用于释放内存的代码被跳过的场景。

用一个动态分配的地址来初始化智能指针,在析构的时候释放内存,就确保了这一点。因为析构函数总是会被执行的,这样所包含的内存也将总是会被释放。

无论何时,一定得由第二条指令来释放之前另一条指令所分配的资源时,RAII都是适用的。

作用域指针

一个作用域指针独占一个动态分配的对象。对应的类名为boost::scoped_ptr,它的定义在boost/scoped_ptr.hpp中。不像std::auto_ptr,一个作用域指针不能传递它所包含的对象的所有权到另一个作用域指针。一旦用一个地址来初始化,这个动态分配的对象将在析构阶段释放。

因为一个作用域指针只是简单保存和独占一个内存地址,所以boost::scoped_ptr的实现就要比std::auto_ptr简单。在不需要所有权传递的时候应该优先使用 boost::scoped_ptr。

作用域数组

作用域数组的析构函数使用delete[]操作符来释放所包含的对象。因为该操作符只能用于数组对象,所以作用域数组必须通过动态分配的数组来初始化。对应的作用域数组类名为boost::scoped_array定义在boost/scoped_array.hpp里 。

共享指针

boost::shared_ptr这是使用率最高的只能指针。C++11标准中已加入为shared_ptr。不同意boost::scoped_ptr是共享指针不一定要独占一个对象,它可以和其他共享指针共享所有权,在这种情况下,当引用对象的最后一个只能指针销毁后,对象才会被释放。

共享数组

共享数组的行为类似于共享指针。关键不同在于共享数组在析构时,默认使用delete[]操作符来释放所含的对象。因为这个操作符只能用于数组对象,共享数组必须通过动态分配的数组的地址来初始化。共享数组对应的类型是boost::shared_array。

弱指针

到目前为止介绍的各种智能指针都能在不同的场合下独立使用。相反,弱指针只能在配合共享指针一起使用时才有意义。若指针boost::weak_ptr. boost::weak_ptr必定总是通过boost::shared_ptr来初始化的。一旦初始化之后,它基本上只提供一个有用的方法:lock()。此方法返回的boost::shared_ptr与用来初始化弱指针的共享指针共享所有权。如果这个共享指针不含有任何对象,返回的共享指针也将是空的。当函数需要一个由共享指针所管理的对象,而这个对象的生存期又不依赖于这个函数时,就可以使用弱指针。只要程序中还有一个共享指针掌管着这个对象,函数就可以使用该对象。如果共享指针复位了,就算函数里能得到一个共享指针,对象也不存在了。

介入式指针

大体上,介入式指针的工作方式和共享指针完全一样。 boost::shared_pt在内部记录着引用到某个对象的共享指针的数量,可是对介入式指针来说,程序员就得自己来做记录。对于框架对象来说这就特别有用,因为他们记录着自身被引用的次数。介入式指针boost::intrusive_ptr定义在boost/intrusive_ptr.hpp里。

指针容器

在你见过BoostC++库的各种智能指针之后,应该能够编写安全的代码,来使用动态分配的对象和数组。多数时候,这些对象要存储在容器里——如上所述——使用boost::shared_ptr和boost::shared_array这就相当简单了。第一,反复声明boost::shared_ptr需要更多的输入。其次,将boost::shared_ptr拷进,拷出,或者在容器内部做拷贝,需要频繁的增加或者减少内部引用计数,这肯定效率不高。由于这些原因,BoostC++库提供了指针容器专门用来管理动态分配的对象。

boost::ptr_vector类的定义在boost/ptr_container/ptr_vector.hpp里,它跟前一个例子中用boost::shared_ptr模板参数来初始化的容器具有相同的工作方式。boost::ptr_vector专门用于动态分配的对象,它使用起来更容易也更高效。boost::ptr_vector独占它所包含的对象,因而容器之外的共享指针不能共享所有权,这跟std::vector<boost::shared_ptr<int>>相反。

上一篇:使用Java开发微信公众平台(二)——消息的接收与响应


下一篇:build/core/config.mk