栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++11 --- 智能指针(shared

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++11 --- 智能指针(shared

1. 智能指针的初始化
// 1. 智能指针的初始化
    shared_ptr p(new myclass);
    shared_ptr p2 = p;
    shared_ptr ptr; //未初始化的智能指针,可以通过reset进行初始化
    ptr.reset(new int(1));

    // 应该优先使用make_shared构造智能指针,更高效
    shared_ptr p3 = make_shared();
    p3->print();

    // 不能将一个原始指针直接赋值给一个指针指针,例如下面是错误的
    // shared_ptr p4 = new int(1); //编译报错,不允许直接赋值
2. 获取原始指针
    shared_ptr ptr1(new myclass);
    myclass* p_original = ptr1.get();
    p_original->print();
3. 指定删除器
    // 3. 指定删除器
    // 3.1 智能指针初始化可以指定删除器,当p31的引用计数为0时,会自动调用删除器释放对象的内存,删除器可以是一个类模板函数
    shared_ptr p31;
    p31.reset(new myclass("p31"), DeleteIntPtr);
    shared_ptr p32(new myclass("p32"), [](myclass* p){cout<< p->name<p33(new myclass[10], [](myclass* p){ delete[] p;});
    cout<< "p33 " < p34(new myclass[10], std::default_delete());
    cout<<"p34 "<< p34.get()[8].name< p35 = make_shared_array(10);
    cout<<"p35  = "< 
4.shared_ptr 需要注意的问题 
    // 4.1 不要用一个原始指针初始化多个shared_ptr例如下面的:
        int* p4 = new int;
        shared_ptr p41(p4);
        shared_ptr p42(p4);
    // 4.2 不要在函数实参中创建shared_ptr,如下
        // function(shared_ptr(new int),g());//有问题
        // 因为c++编译器对参数的解读不同,有的编译器会从左向右,有的会从右向左,所以可能会先new 然后调用g()函数,如果g函数异常,而shared_ptr 还没创建,则int 内存泄露
        // 正确的做法应如下:
        // shared_ptr p43(new int);
        // f(p, g());

    // 4.3 通过shared_from_this() 返回指针,不要将this指针作为shared_ptr返回出来,因为this是裸指针,会导致重复析构
    
    // 4.4  避免循环引用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942578.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号