• c++动态内存知识总结与疑问


    书名  BOOK TITLE

      《Primer c++  第5版》

    基本信息 BASICS

    1. 阅读进度:第12章动态内存

    阅读心得 LEARNINGS

    1.  在c++中,我知道的有静态内存、栈内存、和动态内存三种,其中 静态内存的成员用static修饰,一旦声明,及时是在局部的函数内部使用,也得等到整个程序结束才会消失。(这里我的疑问,我还从没见过静态的指针变量,这种变量可以有吗?如果存在,它属于静态内存还是动态内存?它该怎么消亡。)
    2. 栈内存,是用在函数块里面声明的变量,其特点是变量在出了作用域块之后,就自动出栈,并且先构建的变量要后出栈。
    3. 最后个动态内存,它是在堆上的内存,普通形式就是以指针的形式存在在代码中。可用智能指针(shared_ptr、unique_ptr、weak_ptr)降低使用难度,如果是普通的指针,无论是在函数块内还是成员变量,如果不手动delete,它会一直存在(程序结束了,都没有释放内存,这个内存它还存在吗?我猜,是不会存在的,因为在操作系统上,一个进程或线程结束了,其中的内存就会被回收掉,而一个程序有可能就是线程或者进程)
    4. delete只能进行一次,如果删除了还继续删除,其行为是未定义的(会不会造成这个内存无法在被回收分配了?) 
    5. delete之后,会产生空悬指针,其危害和未初始的指针一样,所以在初始化和删除指针时都要进行 ptr=NULL的操作。
    6. delete还有这样的问题,例子:
    int* ptr1=new int(4);
    int *ptr2=ptr1;
    delete ptr1;
    ptr1=NULL;
    ptr2=NULL;
    //这里我们在指针赋值之后,删除了ptr1,并置为空指针,这个时候ptr2也释放了,
    //但并不能让ptr2也重置为空指针,所以需要把ptr2也置为空指针。
    //我觉得如果不这样做,在判断ptr2是否为空这里就会出现问题。

    7. 当在delete指针之前,发生了异常,并且没有使用try catch,那么这个内存将不会被释放掉。

    ------------------------------------------------------智能指针部分

    1. 我也是第一次接触这个东西,总结起来十分的吃力。智能指针需要引用头文件<memory>。首先我的理解是指向这个内存的智能指针“指向“数量变为0了,程序就会自动释放掉这个内存。分享型智能指针允许有多个分享型指针指向同一内存;unique类型的,只允许一个指针指向这个内存;弱指针,用弱指针指向的内存不增加指向计数。这是我的总体上的了解,下面进行更细致的了解。

    2. 智能指针p可以作为判断条件,如果p指向了一个对象则 if(p)为true。

    3.分享型智能指针拷贝,作为参数传递给函数,作为函数的返回值,都会增加指针计数器。

    4. 当我们给 “分智”指针赋予新值或是被销毁,指针计数器会减1.(被销毁具体指哪些?)

    5. “分智”指针 ,若p.use_count()==1 ,则p.unique() 会return true; else return false;

    6. shared_ptr<T>p(u),从unique_ptr,将u置为空。

    7. 不要使用get初始化另一个智能指针。考虑这样的代码:

    shared_ptr<int> p(new int(42));
        int * q = p.get();
        {
            shared_ptr<int>m(q);
        }
        int foo = *p;
    
        cout << foo << endl;//输出一串很大的数字

    8. 使用自己定义的释放函数释放智能指针,及时发生了异常同样能被释放。例如:

    void end_conn(conn*p){disConn(*p);}
    void f(destination &d,...){
        conn c=connect(&d);
        shared_ptr<conn>p(&c,end_conn);
        //这里的c不是new的,所以要传递一个自己写的删除器end_conn;
        }

    9. unique_ptr试图拷贝一个unique_ptr指针是错误的。

    10. weak_ptr中,w.expired()表示 如果指针计数为0,则这个弱指针过时了,返回true。

    11. w.lock() 若expired返回true,则 lock返回空指针,否则返回一个shared_ptr。

  • 相关阅读:
    【OpenCV学习】XML的读写
    【学术研究基础】聚类分析学习
    【OpenCV学习】Laplace变换(视频边界检测)
    【OpenCV学习】DFT变换
    【英语天天读】生命的起跑线
    【OpenCV学习】yml的读取
    【OpenCV学习】Kmean均值聚类对图片进行减色处理
    【英语天天读】born to win
    WinFrom 中 label背景透明
    dev GridControl双击行事件
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/12582671.html
Copyright © 2020-2023  润新知