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);
  • 相关阅读:
    不要为自己找借口,你可以做到的--职场实用做人法则
    sql server 利用发布订阅方式实现数据库同步问题
    关于免费空间的寻找
    数据自定义格式化
    C++字符串string类常用操作详解(一)【初始化、遍历、连接】
    C++ 命名空间
    gcc/g++ 如何支持c11 / c++11标准编译
    正确的C++/C堆栈
    linux下清空c++ cin无效流的方式
    32位64位下各种数据类型大小的对比
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12653825.html
Copyright © 2011-2022 走看看