boost C++库学习(1)-- smart pointers
程序员文章站
2022-03-11 17:22:42
...
1. 作用域指针boost::scoped_ptr
一个作用域指针boost::scoped_ptr.独占一个动态分配的对象。一个作用域指针不能传递它所包含的对象的所有权到另一个作用域指针。
#include <boost::scoped_ptr.hpp>
int main()
{
boost::scoped_ptr<int> i(new int);
*i = 1;
*i.get() = 2;
i.reset(new int);
}
重载了操作符operator*(), operator->(). get()返回所含对象的地址,reset()用新的对象来重新初始化智能指针,新创建的对象赋值之前会先自动释放所包含的对象。
2. 作用域数组boost::scoped_array
作用域数组的析构函数使用delete[]操作符来释放所包含的对象。
#include <boost/scoped_array.hpp>
int main()
{
boost::scoped_array<int> i(new int[2]);
*i.get() = 2;
i[0] = 1;
i[1] = 2;
i.reset(new int[3]);
}
3. 共享指针shared_ptr
任何一个共享指针都可以被复制,当引用对象的最后一个智能指针销毁后,对象才会被释放。标准容器里可以存储智能指针,而标准容器中不能存放std::auto_ptr.
#include <boost/shared_ptr.hpp>
#include <vector>
int main()
{
std::vector<boost::shared_ptr<int> > v;
v.push_back(boost::shared_ptr<int>(new int(1)));
v.push_back(boost::shared_ptr<int>(new int(2)));
*(v[1].get()) = 3;
std::vector<boost::shared_ptr<int> >::iterator iter;
iter = v.begin();
*((*iter).get()) = 4;
*((*(v.begin()))) = 5;
std::vector<boost::shared_ptr<int> >::iterator iter1;
iter1 = v.end() -1; //注意v1.end()指向的是最后一个元素的下一个位置,所以访问最后一个元素
//的正确操作为:v1.end() - 1;
*((*iter1).get()) = 6;
}
#include <boost/shared_ptr.hpp>
int main()
{
boost::shared_ptr<int> i1(new int(1));
boost::shared_ptr<int> i2(i1);
i1.reset(new int(2));
}
本例中定义了2个共享指针 i1 和 i2,它们都引用到同一个
int
类型的对象。i1 通过 new
操作符返回的地址显示的初始化,i2 通过 i1 拷贝构造而来。 i1 接着调用reset()
,它所包含的整数的地址被重新初始化。不过它之前所包含的对象并没有被释放,因为
i2 仍然引用着它。 智能指针 boost::shared_ptr
记录了有多少个共享指针在引用同一个对象,只有在最后一个共享指针销毁时才会释放这个对象。4.共享数组shared_array
#include <boost/shared_array.hpp>
#include <iostream>
int main()
{
boost::shared_array<int> i1(new int[2]);
boost::shared_array<int> i2(i1);
i1[0] = 1;
std::cout << i2[0] << std::endl;
}
上一篇: 2 Pointers
下一篇: 07 Smart Pointers