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

    我现在有一段代码:

    int main(int argc, char const *argv[])
    {
        int *p = new int(5);
        return 0;
    }

    使用了上篇博客刚学的new,new了一个int对象 值为5,但是在结束之前没有delete,也可以通过编译,也没报错。

    如果我代码量很大那很容易因为这个指针没有及时释放而对程序整体进行破坏,或者叫 内存泄露。

    我们都知道必须在new过之后使用delete,但是delete后的指针并非指空,除非你手动让其为NULL

    如果遇到这样的情况

    auto func(int &a)
    {
        int *p = new int(1);
        if(a == 7)
        {
            /*执行一个什么程序*/
            return 5;
        }
        delete p;
        p = NULL;
        return 3;
    }

    满足了一个条件之后直接跳去执行其他的函数了回来就已经return了,那这个指针就没得delete了

    可能会有很多我们new过了忘记delete的情况

    所以为了解决这样的问题:我们引入了智能指针

    1)智能指针能够帮助我们处理资源泄露问题;
    2)它也能够帮我们处理空悬指针的问题;
    3)它还能够帮我们处理比较隐晦的由异常造成的资源泄露。

    智能指针

    1、auto_ptr     c++11 已经将此指针弃用,所以可以少学一个指针了

    2、shared_ptr  多个指针可以指向相同对象,在最后一个引用被销毁时释放

    3、unique_ptr  同一时间内只有一个指针可以指向该对象

    4、weak_ptr  弱智能指针,配合shared_ptr使用

    shared_ptr

    首先包含头文件

    #include <memory>

    使用方法如下:

    shared_ptr<int> ptr1(new int(4));

    表示定义了一个指向 int 型数据 4 的 int 型指针 ptr

    shared_ptr<int> ptr2(ptr1)

    表示用 ptr1 去初始化 ptr2

    shared_ptr<int> ptr3

    相当于以前的 int *ptr = new int ; 或者 只是 int *ptr

    然后使用这个ptr3

        ptr3.reset(new int(6));

    把ptr3的值传给p

         int *p = ptr3.get();

    引用计数,查看被引用了多少次

    ptr.use_count()

    检查ptr是否原始指针唯一拥有者

    ptr.unique()

    交换p q两个指针

    swap(q,p);
    p.sawp(q);
  • 相关阅读:
    css三角形拼接多边形
    弹框提示Request failed with status code 401
    el-upload组件上传闪动
    vue-element-admin校验不通过 页面跳到滚动位置
    请求方式错误
    IE兼容11支持10不支持
    二次封装elementui弹框
    element多张上传的去除动画
    奇怪的知识增加了,python切片特点以及下标的活用,可变tuple
    LeafHttp,同步、异步请求的Http库
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12653825.html
Copyright © 2011-2022 走看看