boost>shared_ptr

本文旨在探讨Boost库中的shared_ptr,这是一种智能指针,通过引用计数管理内存。在C++ Primer中有所提及,Boost库导论提供了详细教程。

由于前辈们在开发事广泛使用了boost的shared_ptr因此我打算自己了解一些这个shared_ptr。

 

shared_ptr应该就是一种智能指针,这一概念在C++primer当中有提到过。或者称“引用计数指针”

 

boost shared_ptr的教程内容网上有不少,其中比较详细的要算《boost库导论》了。

 
 

shared_ptr

头文件: "boost/shared_ptr.hpp"

shared_ptr 可以从一个裸指针、另一个shared_ptr、一个std::auto_ptr、或者一个boost::weak_ptr构造。还可以传递第二个参数给shared_ptr的构造函数,它被称为删除器(deleter)。删除器稍后会被调用,来处理共享资源的释放。这对于管理那些不是用new分配也不是用delete释放的资源时非常有用(稍后将看到创建客户化删除器的例子)。shared_ptr被创建后,它就可象普通指针一样使用了,除了一点,它不能被显式地删除。

以下是shared_ptr的部分摘要;最重要的成员和相关普通函数被列出,随后是简单的讨论。

成员函数
template <class Y> explicit shared_ptr(Y* p);

这个构造函数获得给定指针p的所有权。参数 p 必须是指向 Y 的有效指针。构造后引用计数设为1。唯一从这个构造函数抛出的异常是std::bad_alloc (仅在一种很罕见的情况下发生,即不能获得引用计数器所需的自由空间)。

template <class Y,class D> shared_ptr(Y* p,D d);

这个构造函数带有两个参数。第一个是shared_ptr将要获得所有权的那个资源,第二个是shared_ptr被销毁时负责释放资源的一个对象,被保存的资源将以d(p)的形式传给那个对象。因此p的值是否有效取决于d。如果引用计数器不能分配成功,shared_ptr抛出一个类型为std::bad_alloc的异常。

shared_ptr(const shared_ptr& r);

r中保存的资源被新构造的shared_ptr所共享,引用计数加一。这个构造函数不会抛出异常。

template <class Y> explicit shared_ptr(const weak_ptr<Y>& r);

从一个weak_ptr (本章稍后会介绍)构造shared_ptr。这使得weak_ptr的使用具有线程安全性,因为指向weak_ptr参数的共享资源的引用计数将会自增(weak_ptr不影响共享资源的引用计数)。如果weak_ptr为空 (r.use_count()==0), shared_ptr 抛出一个类型为bad_weak_ptr的异常。

template <typename Y> shared_ptr(std::auto_ptr<Y>& r);

这个构造函数从一个auto_ptr获取r中保存的指针的所有权,方法是保存指针的一份拷贝并对auto_ptr调用release。构造后的引用计数为1。而r当然就变为空的。如果引用计数器不能分配成功,则抛出 std::bad_alloc

~shared_ptr();

shared_ptr析构函数对引用计数减一。如果计数为零,则保存的指针被删除。删除指针的方法是调用operator delete 或者,如果给定了一个执行删除操作的客户化删除器对象,就把保存的指针作为唯一参数调用这个对象。析构函数不会抛出异常。

shared_ptr& operator=(const shared_ptr& r);  

赋值操作共享r中的资源,并停止对原有资源的共享。赋值操作不会抛出异常。

void reset();

reset

### boost::shared_ptr 使用方法与示例详解 `boost::shared_ptr` 是 Boost 庢库中提供的智能指针,用于管理动态分配的对象,确保对象在不再被引用时自动释放内存。它的行为与 C++11 标准库中的 `std::shared_ptr` 类似[^2]。以下是 `boost::shared_ptr` 的详细用法和示例: #### 1. 基本使用 `boost::shared_ptr` 可以通过构造函数初始化,并且支持复制和赋值操作。每当创建一个新的 `boost::shared_ptr` 或将其赋值给另一个 `boost::shared_ptr` 时,引用计数会增加;当一个 `boost::shared_ptr` 被销毁时,引用计数会减少。如果引用计数变为零,则会自动释放所管理的对象。 ```cpp #include <boost/shared_ptr.hpp> #include <iostream> class MyClass { public: MyClass() { std::cout << "MyClass constructed\n"; } ~MyClass() { std::cout << "MyClass destructed\n"; } }; int main() { // 创建一个 shared_ptr 管理 MyClass 对象 boost::shared_ptr<MyClass> ptr1(new MyClass()); // 引用计数为 1 { // 复制 shared_ptr,引用计数增加 boost::shared_ptr<MyClass> ptr2 = ptr1; // 引用计数为 2 // 在此作用域内,ptr2 仍然存在 } // ptr2 被销毁,引用计数减为 1 // 当 ptr1 被销毁时,引用计数变为 0,MyClass 对象会被释放 } // 输出:MyClass destructed ``` #### 2. 自定义删除器 `boost::shared_ptr` 支持自定义删除器,允许用户指定如何释放资源。这在管理非标准资源(如文件句柄或网络连接)时非常有用。 ```cpp #include <boost/shared_ptr.hpp> #include <iostream> void customDeleter(int* p) { std::cout << "Custom deleter called\n"; delete p; } int main() { // 使用自定义删除器 boost::shared_ptr<int> ptr(new int(42), customDeleter); // 当 ptr 被销毁时,customDeleter 将被调用 } // 输出:Custom deleter called ``` #### 3. 循环引用问题 虽然 `boost::shared_ptr` 提供了自动内存管理功能,但在某些情况下可能会导致循环引用问题。例如,两个对象互相持有对方的 `shared_ptr`,从而阻止它们被销毁。为了解决这一问题,可以使用 `boost::weak_ptr`[^1]。 ```cpp #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> #include <iostream> class B; class A { public: boost::shared_ptr<B> b; ~A() { std::cout << "~A()\n"; } }; class B { public: boost::weak_ptr<A> a; // 使用 weak_ptr 避免循环引用 ~B() { std::cout << "~B()\n"; } }; int main() { boost::shared_ptr<A> a(new A()); boost::shared_ptr<B> b(new B()); a->b = b; b->a = a; // 存储 weak_ptr,不会增加引用计数 // 当 a 和 b 被销毁时,A 和 B 对象也会被正确释放 } // 输出:~B() ~A() ``` #### 4. 比较操作 `boost::shared_ptr` 重载了比较操作符(如 `==` 和 `!=`),用于判断两个 `shared_ptr` 是否指向同一个对象,而不是比较指针的地址[^3]。 ```cpp #include <boost/shared_ptr.hpp> #include <iostream> int main() { boost::shared_ptr<int> ptr1(new int(42)); boost::shared_ptr<int> ptr2 = ptr1; if (ptr1 == ptr2) { std::cout << "ptr1 and ptr2 point to the same object\n"; } } ``` ### 注意事项 - `boost::shared_ptr` 的引用计数是线程安全的,但访问所管理的对象本身不是线程安全的[^4]。 - 如果需要独占所有权的智能指针,可以考虑使用 `boost::scoped_ptr` 或 `boost::unique_ptr`[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值