shared_ptr是一个最像指针的“智能指针”,是boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的。
shared_ptr实现的是引用计数的智能指针,可以被自由拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中。
示例1:
#include <boost/smart_ptr.hpp>
#include <iostream>
#include <cassert>
using namespace boost;
using namespace std;
int main()
{
shared_ptr<int> sp(new int(10)); //一个指向整数的shared_ptr
assert(sp.unique()); //现在shared_ptr是指针的唯一持有者
shared_ptr<int> sp2 = sp; //第二个shared_ptr,拷贝构造函数
assert(sp == sp2 && sp.use_count() == 2);
*sp2 = 100; //使用解引用操作符修改被指对象
assert(*sp == 100);
sp.reset(); //停止shared_ptr的引用
assert(!sp); //sp不再持有任何指针(空指针)
return 0;
}
示例2:
#include <boost/smart_ptr.hpp>
#include <iostream>
#include <cassert>
using namespace boost;
using namespace std;
class shared //一个拥有shared_ptr的类
{
private:
shared_ptr<int> p;
public:
shared(shared_ptr<int> p_) : p(p_) { } //构造函数初始化shared_ptr
void print() //输出shared_ptr的引用计数和指向的值
{
cout << "count: " << p.use_count()
<< " v = " << *p << endl;
}
};
void print_func(shared_ptr<int> p)
{
//同样输出shared_ptr的引用计数和指向的值
cout << "count: " << p.use_count()
<< " v = " << *p << endl;
}
int main()
{
shared_ptr<int> p(new int(110));
shared s1(p), s2(p); //构造两个自定义的类
s1.print();
s2.print();
*p = 20; //修改shared_ptr所指的值
print_func(p);
s1.print();
return 0;
}
在声明了shared_ptr和两个shared实例后,指针被它们所共享,因此引用计数为3.printf_func函数内部拷贝了一个shared_ptr对象,因此引用计数再增加1,但当退出函数时拷贝自动析构,引用计数又恢复3。
程序运行结果如下:
count:3 v = 110
count:3 v = 110
count:4 v = 20
count:3 v = 20