Boost 库应用——智能指针(一)

本文详细介绍了智能指针的概念及其在C++中的应用,包括作用域指针(scoped_ptr)和共享指针(shared_ptr)。通过示例展示了如何使用这两种智能指针管理资源,并讨论了它们之间的区别及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

智能指针是利用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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值