您的位置:首页 > 其它

boost 智能指针使用

2017-07-18 16:13 281 查看
1、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.

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  智能指针 boost