@nrailgun
2015-10-05T21:50:26.000000Z
字数 1216
阅读 1717
程序设计
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);