boost库之智能指针

发布时间 2023-06-09 15:57:04作者: TechNomad

一、boost::scoped_ptr

boost::scoped_ptr是Boost库中的一个智能指针类,用于管理动态分配的对象,并确保在超出作用域时自动释放资源。boost::scoped_ptr提供了一种简单而安全的方式来管理对象的生命周期。它的行为类似于C++原始指针,但它负责在其生命周期结束时自动调用delete来释放所管理的对象。它是一个非共享指针,即不能进行拷贝构造或赋值操作,这样可以避免多个指针同时删除同一个对象的问题。

示例演示:

#include <iostream>
#include <boost/scoped_ptr.hpp>

class SmartPointers
{
public:
    SmartPointers():m_value(0) { std::cout << "智能指针构造函数" << std::endl; }
    ~SmartPointers() { std::cout <<  "智能指针析构函数" << std::endl; }

public:
    void setValue(int value) { m_value = value; }
    int getValue() { return m_value; }

private:
    int m_value;
};

void test() {
    boost::scoped_ptr<SmartPointers> smartPointer(new SmartPointers);
    smartPointer->setValue(10);
    std::cout << smartPointer->getValue() << std::endl;
}

int main() {
    test();
    return 0;
}

打印结果:

 可以看出当离开test()作用域后,调用了SmartPointers的析构函数,说明boost::scoped_ptr调用了delete释放了内存

boost::scoped_ptr部分源码:

private:
    scoped_ptr(scoped_ptr const &);
    scoped_ptr & operator=(scoped_ptr const &);
    void operator==( scoped_ptr const& ) const;
    void operator!=( scoped_ptr const& ) const;

从上述源码中可以看出boost::scoped_ptr 是一个非共享指针,即不能进行拷贝构造或赋值操作。这意味着每个 boost::scoped_ptr 对象拥有独立的所有权,避免了资源释放的重复和悬挂指针的问题。

boost::scoped_ptr常用操作:

/* 用一个新的对象来重新初始化智能指针 */
void reset(T * p = 0)

/* 以引用的形式访问所管理的对象的成员 */
T & operator*()

/* 以指针的形式访问所管理的对象的成员 */
T * operator->() 

/* 获取所含对象的指针 */
T * get()

/* 交换两个boost::scoped_ptr管理的对象 */
void swap(scoped_ptr & b)

示例演示:

void test() {
    boost::scoped_ptr<SmartPointers> smartPointer(new SmartPointers);
    smartPointer->setValue(10);
    std::cout << "----------交换前----------" << std::endl;
    std::cout << smartPointer->getValue() << std::endl;
    std::cout << smartPointer.get()->getValue() << std::endl;
    std::cout << (*smartPointer).getValue() << std::endl;
    
    boost::scoped_ptr<SmartPointers> smartPointer_1(new SmartPointers);
    smartPointer_1->setValue(20);
    smartPointer.swap(smartPointer_1);
    std::cout << "----------交换后----------" << std::endl;
    std::cout << smartPointer->getValue() << std::endl;
    std::cout << smartPointer_1->getValue() << std::endl;
}

打印结果: