参考资料:http://zh.highscore.de/cpp/boost/
智能指针
智能指针: std::auto_ptr 。 基本上就像是个普通的指针: 通过地址来访问一个动态分配的对象。 std::auto_ptr 之所以被看作是智能指针,是因为它会在析构的时候调用 delete 操作符来自动释放所包含的对象。 当然这要求在初始化的时候,传给它一个由 new 操作符返回的对象的地址。
std::auto_ptr在传递对象时,将对象的所有权传递给其他std::auto_ptr指针,也可使用release将指针所有权释放,给与对象指针。
若无智能指针,则每一个动态分配内存的函数都需要捕捉所有可能的异常,以确保在异常传递给函数的调用者之前将内存释放掉。详情请查看Boost C++ 库 Smart Pointers。
方法:
get() :返回所含对象的地址;
reset() :用一个新的对象来重新初始化智能指针;
release():释放对其指针的所有权,并不调用delete;
RAII
资源申请即初始化,关键在于使用析构函数进行销毁对象,从而保证动态分配的内存得到释放
作用域指针
一个作用域指针独占一个动态分配的对象;不可直接使用‘=’更改指针指向的对象即不能将包含的对象转移给其他作用域指针,一旦使用reset转移,则使用delete释放原来的对象。
类名:
boost::scoped_ptr
位置:
boost/scoped_ptr.hpp
boost::scoped_ptr 的析构函数中使用 delete 操作符来释放所包含的对象。(注意与boost:scoped_array 类进行区分)
例子:
int main()
{
boost::scoped_ptr<int> i(new int);
*i = 1;
*i.get() = 2;
i.reset(new int);
}
作用域数组
使用方式与作用域指针相似,作用域数组的析构函数使用 delete[] 操作符来释放所包含的对象。
类名:
boost::scoped_array
位置:
boost/scoped_array.hpp
例子:
int main()
{
boost::scoped_array<int> i(new int[2]);
*i.get() = 1;
i[1] = 2;
i.reset(new int[3]);
}
共享指针
与作用域指针相似,但不一定独占一个对象。可以和其他指针共享对象有所有权,当指向对象的最后一个指针销毁之后,对象被释放。boost::shared_ptr 在内部记录着引用到某个对象的共享指针的数量。
类名:
boost::shared_ptr
位置:
boost/shared_ptr.hpp
boost::shared_ptr 的构造函数的第二个参数是一个普通函数或者函数对象,这个方法会在共享指针超出它的作用域时自动调用,可用于销毁所含的对象。
例子1:
int main()
{