一、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; }
打印结果:
标签:const,smartPointer,智能,scoped,boost,ptr,指针 From: https://www.cnblogs.com/QingYiShouJiuRen/p/17469434.html