[关闭]
@nrailgun 2015-10-05T21:50:26.000000Z 字数 1216 阅读 1717

Boost 智能指针

程序设计


智能指针

C++ auto_ptr 在 C++11 被认定为过时的。Boost 设计了
scoped_ptrscoped_arrayshared_ptrshared_array 这四种指针来满足内存管理的需求。

scope_* 只能所有权不能共享,出作用域即销毁;shared_* 是共享指针,仅当所有指针释放才 free 内存。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <string>
  5. #include <boost/scoped_ptr.hpp>
  6. #include <boost/scoped_array.hpp>
  7. #include <boost/shared_ptr.hpp>
  8. #include <boost/shared_array.hpp>
  9. using namespace std;
  10. using namespace boost;
  11. class Base
  12. {
  13. public:
  14. Base() {
  15. cout << "Base()" << endl;
  16. }
  17. ~Base() {
  18. cout << "~Base()" << endl;
  19. }
  20. };
  21. boost::shared_ptr<Base> create_base()
  22. {
  23. boost::shared_ptr<Base> p(new Base());
  24. return p;
  25. }
  26. int main(int argc, char *argv[])
  27. {
  28. {
  29. scoped_ptr<Base> scope_p(new Base());
  30. }
  31. boost::shared_ptr<Base> sp = create_base();
  32. sp.reset();
  33. return EXIT_SUCCESS;
  34. }

指针容器

仅仅有指针和数组显然是不够的,需要更多的数据结构!Boost 提供了指针容器,用来存放动态分配的对象,其行为类似于 unique_ptr 的容器。

  1. int main(int argc, char *argv[])
  2. {
  3. ptr_vector<Base> v;
  4. for (int i = 0; i < 1; ++i) {
  5. v.push_back(new Base());
  6. }
  7. return EXIT_SUCCESS;
  8. }

BOOST_SCOPE_EXIT

C++ 以前有使用容器来保证内存被正确释放的做法,不过 BOOST_SCOPE_EXIT 可以做得更方便。

  1. int *i = new int{10};
  2. BOOST_SCOPE_EXIT(&i)
  3. {
  4. delete i;
  5. } BOOST_SCOPE_EXIT_END

Pool

new 虽然很好,不过频繁释放和申请还是会影响性能。Boost 提供了 boost::object_pool 来对于固定大小的,频繁的内存申请与释放操作进行优化。这看起来很像是一个内存池。

  1. boost::object_pool<int> pool;
  2. int *i = pool.malloc();
  3. *i = 1;
  4. int *j = pool.construct(2);
  5. pool.destroy(i);
  6. pool.destroy(j);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注