boost 智能指针使用

1、scoped_ptr

    基本功能类似auto_ptr。首先确保任何时候对象都能被正确的删除。且 scoped_ptr所有权不能转让,一旦获取,无法从它那里取回。

    //scoped_ptr 不能作为容器的元素,不允许不支持拷贝和赋值,因为拷贝和赋值函数是私有的。
    //即,不存在 sp1 = sp2 这样的操作。
    scoped_ptr<string> sp(new string("test"));
    std::cout << *sp << std::endl;
    std::cout << sp->size() << std::endl;
    //sp is smart_ptr, not use delete for it.

   成员函数reset()功能是重置scoped_ptr,删除原来保存的指针,在保存新的指针值。

2、scoped_array

//构造函数接受的指针必须是new[]的结果 不是new()的结果。没有*, ->操作符的重载
    //析构函数必须是delete[] 释放, 不是delete
    //重载operator[],像数组一样的用下标访问元素
    scoped_array<int> sa(new int[100]);   
    std::fill_n(&sa[0], 100, 5);
    sa[10] = sa[20] + sa[30];
    sa[0] = 10;
    // *(sa + 1) = 20;  //错误的用法,因为重载operator[], 不支持数组首地址+N的方式访问数组元素


3、shared_ptr 

//shared_ptr 是线程安全的, 一个shared_ptr可以被多个线程安全读取

 shared_ptr<int> spi(new int(10));

 shared_ptr<string> sps(new string("smart"));

 

typedef vector<shared_ptr<int>> vs;   //一个持有shared_ptr的标准容器
 vs v(10);                             //声明一个10元素的容器, 初始化为空指针

    int i = 0;
    for (auto iter = v.begin(); iter != v.end(); ++ iter)
    {
        (*iter) = make_shared<int>(i++);   //应该试用工厂函数来消除对new的大量使用, 可接受10多个参数,参数将传递给类型T的构造函数,创建一个shared_ptr<T>对象并返回
        std::cout << *(*iter) << ",";
    }
    std::cout << std::endl;

 //eg;
    shared_ptr<std::string> spFac = make_shared<std::string>("make_shared");
    shared_ptr<vector<string, int>> spVec = make_shared<vector<string, int>>("string", 10);


    /*有两种方法将shared_ptr用于容器
      1、 将容器作为shared_ptr的管理对象, 如shared_ptr<List<T>>,使容器可以被安全的共享,用法与普通shared_ptr相同。 如  shared_ptr<int> pp = v[9];
      2、 将shared_ptr作为容器的元素,如vector<shared_ptr<int>>
    */

shared_ptr<void *>();  //shared_ptr可以存储void*类型指针


4、shared_array

/构造函数接受的指针必须是new[]的结果 不是new()的结果。没有*, ->操作符的重载
    //析构函数必须是delete[] 释放, 不是delete
    //重载operator[],像数组一样的用下标访问元素

    int * pI = new int[100];
    shared_array<int> saa(pI);
    shared_array<int> saa2 = saa;


    saa[0] = 10;    //shared_array 重载operator[]
    assert(saa2[0] == 10);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值