zoukankan      html  css  js  c++  java
  • C++——智能指针

    动态内存管理:new-delete——很难正确释放内存——智能指针

    使用场景:

    1.程序不知道自己要使用多少对象

    2.程序不知道自己所需对象的准确类型

    3.程序需要在多个对象之间共享数据

    4.坚持只使用智能指针,可以避免指针的内存管理可能带来的问题:

    • 忘记delete内存——内存泄漏
    • 使用已经释放掉的空间 
    • 同一块内存释放两次
    • 查找指向相同内存的指针非常困难
    void f()
    {
        shared_ptr<int> sp(new int(42));
        //之后的代码出现异常,在f中没有被捕获
    }//函数结束时,shared_ptr会自动释放内存
    
    void f()
    {
        int *ip=new int(42);
        //之后的代码出现异常,在f中没有被捕获
        delete ip;
    }//如果在new和delete之间发生异常,且没有捕获,内存就永远不会被释放了

    5.不要混合使用普通指针和智能指针

    void process(shared_ptr<int> ptr)//函数被调用时,创建ptr并初始化;值传递,有一次拷贝
    {
        //
    }//ptr离开作用域,被销毁
    
    shared_ptr<int> p(new int(42));//引用计数1
    process(p);//拷贝p会增加引用计数;在process中引用计数为2
    int i=*p;//正确,引用计数为1
    
    int *x(new int(1024));//X是普通指针,不是智能指针
    precess(x);//错误
    process(shared_ptr<int>(x));//合法,但是内存会因为退出函数时,被释放而释放
    int j=*x;//错误,x已经被释放

    类别

    1.shared-ptr:多指针指向同一对象

    make_share<T> ( )

    2.unique-ptr:独占对象

    shared_ptr重要知识点

    1.shared_ptr必须显示直接初始化

    shared_ptr<double> p1;
    shared_ptr<int> p1=new int(1024);//错误,尝试用int*隐式初始化
    shared_ptr<int> p2(new int(42));//正确,直接初始化
    
    shared_ptr<int> clone(int P){
        //return new int(P);//错误
        return shared_ptr<int>(new int(p));//正确,显示绑定
    }

    2.不要用get初始化另一个智能指针或赋值

    get:向不能使用智能指针的代码传递内置指针。智能在确认代码不会被delete情况下才能使用

    shared_ptr<int> p(new int(42));
    int *q=p.get();
    {
        shared_ptr<int> (q);
    }//q被销毁,指向的内存被释放
    int foo =*p;//未定义,p指向的内存已经被释放

    3.不使用相同的内置指针初始化或reset多个智能指针

    4.不delete掉 get()返回的指针。记住原智能指针销毁后,get()的指针就无效了

    5.如果使用智能指针管理的资源不是new分配的内存,记得传递给他一个删除器。//?

    unique_ptr<objT,delT> p(new objT,fcn);

    unique_ptr重要知识点

    1.不能拷贝或赋值它本身,但可以release或reset它指向的内容

    unique_ptr<string> p1(new string("word"));
    unique_ptr<string> p2(p1);//错误
    unique_ptr<string> p3;
    p3=p2;//错误
    
    unique_ptr<string> p2(p1.release());//p2被初始化为p1原来保存的指针,p1置空
    unique_ptr<string> p3(new string("text"));
    p2.reset(p3.release());//释放了p2的“word”内存, p3的所有权转给了p2 ,p3置空
    
    p2.release();//错误,p2不会释放内存, 且丢失了指针
    auto p=p2.release();//正确,但记得delete(p)

    weak_ptr

    1.w=p;不会改变p的引用计数,当最后一个p的对象被释放,w被释放

  • 相关阅读:
    熬夜不易,请老范喝杯烈酒
    php开发面试题---PHP为什么不安全,主要有那些安全问题(整理)
    PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)
    PHP如何安装redis扩展(Windows下)
    网页实时聊天之PHP如何实现websocket
    C++ primer札记10-继承
    【Android】android图片轮播
    Android开发经验—不要指望类finalize干活的方法做你想要什么
    可以部署在广域网执行QQ高仿版 GG2014 (源代码)
    SNMP WINDOWS系统的命令行工具下载
  • 原文地址:https://www.cnblogs.com/yrm1160029237/p/11519928.html
Copyright © 2011-2022 走看看