@nrailgun
        
        2015-10-05T13:50:26.000000Z
        字数 1216
        阅读 1905
    程序设计
C++ auto_ptr 在 C++11 被认定为过时的。Boost 设计了 
scoped_ptr,scoped_array,shared_ptr 和 shared_array 这四种指针来满足内存管理的需求。
scope_* 只能所有权不能共享,出作用域即销毁;shared_* 是共享指针,仅当所有指针释放才 free 内存。
#include <cstdio>#include <cstdlib>#include <iostream>#include <string>#include <boost/scoped_ptr.hpp>#include <boost/scoped_array.hpp>#include <boost/shared_ptr.hpp>#include <boost/shared_array.hpp>using namespace std;using namespace boost;class Base{public:Base() {cout << "Base()" << endl;}~Base() {cout << "~Base()" << endl;}};boost::shared_ptr<Base> create_base(){boost::shared_ptr<Base> p(new Base());return p;}int main(int argc, char *argv[]){{scoped_ptr<Base> scope_p(new Base());}boost::shared_ptr<Base> sp = create_base();sp.reset();return EXIT_SUCCESS;}
仅仅有指针和数组显然是不够的,需要更多的数据结构!Boost 提供了指针容器,用来存放动态分配的对象,其行为类似于 unique_ptr 的容器。
int main(int argc, char *argv[]){ptr_vector<Base> v;for (int i = 0; i < 1; ++i) {v.push_back(new Base());}return EXIT_SUCCESS;}
C++ 以前有使用容器来保证内存被正确释放的做法,不过 BOOST_SCOPE_EXIT 可以做得更方便。
int *i = new int{10};BOOST_SCOPE_EXIT(&i){delete i;} BOOST_SCOPE_EXIT_END
new 虽然很好,不过频繁释放和申请还是会影响性能。Boost 提供了 boost::object_pool 来对于固定大小的,频繁的内存申请与释放操作进行优化。这看起来很像是一个内存池。
boost::object_pool<int> pool;int *i = pool.malloc();*i = 1;int *j = pool.construct(2);pool.destroy(i);pool.destroy(j);
