欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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