智能指针是利用RAII(资源获取即初始化)来管理资源的。 本质思想: 将堆对象的生命周期用栈对象(智能指针)来管理,因为栈对象是有生命周期的,当生命周期结束时自动调用析构函数释放内存空间。 当new一个对象时,立刻使用智能指针来接管这个对象 步骤: 1.在构造函数中进行初始化,用一个智能指针指向这个对象 2.在析构函数中调用delete删除指针,释放堆对象
#include <iostream>
#include <boost/scoped_ptr.hpp>
#include <boost/shared_ptr.hpp>
using namespace std;
class ScopedPtrTest
{
public:
ScopedPtrTest()
{
cout << "ScopedPtrTest_构造函数---" << "智能指针测试项目" << endl;
}
~ScopedPtrTest()
{
cout << "ScopedPtrTest_析构函数---" << "智能指针测试项目" << endl;
}
};
class SharedPtrTest
{
public:
SharedPtrTest()
{
cout << "SharedPtrTest_构造函数---" << "智能指针测试项目" << endl;
}
~SharedPtrTest()
{
cout << "SharedPtrTest_析构函数---" << "智能指针测试项目" << endl;
}
};
/*
作用域指针 boost::scoped_ptr
1.它独占一个动态分配的对象,对应的类名为 boost::scoped_ptr,定义在 boost/scoped_ptr.hpp 中。
2.不像 std::auto_ptr,作用域指针不能传递它所包含的对象的所有权到另一个作用域指针。因为具有作用域,不能跨区域传递所有权,一旦用一个地址来初始化,这个动态分配的对象将在析构阶段释放。
3.因为一个作用域指针只是简单保存和独占一个内存地址,所以 boost::scoped_ptr 的实现就要比 std::auto_ptr 简单。
4.应用:通常可以用它来实现局部动态对象的自动释放,比如在函数调用中产生的动态对象。
*/
void ScopedPtr()
{
cout << "Scoped start" << endl;
boost::scoped_ptr<ScopedPtrTest> scopedP(new ScopedPtrTest);
//boost::scoped_ptr<ScopedPtrTest> scopedP1(scopedP); //作用域指针具有独占性质,编译出错
cout << "Scoped end" << endl;
}
/*
共享指针 boost::shared_ptr
1.对应的类名是boost::shared_ptr,定义在 boost/shared_ptr.hpp 里。
2.内部维护一个引用计数器来判断此指针是不是需要被释放,线程安全的。
3.关键不同之处在于 boost::shared_ptr 不一定要独占一个对象。 同其他 boost::shared_ptr 类型的智能指针共享所有权,任何一个共享指针都可以被复制。
4.当引用对象的最后一个智能指针销毁后,即引用计数值为0时,对象才会被释放。
5.这样就可以在标准容器里存储智能指针了——你不能在标准容器中存储std::auto_ptr,因为它们在拷贝的时候传递了所有权。
*/
void SharedPtr()
{
cout << "Shared Ptr start" << endl;
boost::shared_ptr<SharedPtrTest> shareP1(new SharedPtrTest);
cout << shareP1.use_count() << endl;//引用计数为1
boost::shared_ptr<SharedPtrTest> shareP2 = shareP1;//具有共享性质
cout << shareP2.use_count() << endl;//引用计数为2
/*
1.显示调用析构函数,reset()方法显示将引用计数减少1,一旦引用计数值为0,立即会调用析构函数。
2.等待智能指针本身出作用域之外,调用析构函数。
*/
//shareP1.reset();
//cout << shareP1.use_count() << endl;//引用计数为0
//cout << shareP2.use_count() << endl;//引用计数为1
//shareP2.reset();
//cout << shareP1.use_count() << endl;//引用计数为0
//cout << shareP2.use_count() << endl;//引用计数为0
cout << "Shared Ptr end" << endl;
}
int main()
{
ScopedPtr();
SharedPtr();
cin.get();
return 0;
}