• 动态内存和智能指针


    c++中动态内存的管理是通过一对运算符来完成的:new。在动态内存中为对象分配空间并返回一个指向该对象的指针,我们呢,可以选择对对象进行初始化,delete接受一个动态对象的指针,销毁该对象,并返回与之关联的内存。

    动态内存的使用的不足:

    1.保证在正que的时间释放内存是及其困难

    2.有时我们会忘记释放内存,这样就导致内存泄漏

    3.有时还存在引用内存的情况,但是我们已经释放了它,这样就导致非法内存的指针

    这样就产生了智能指针(smart pointer)来动态管理内存,智能指针优点:

    1.行为类似常规指针

    2.负责自动释放所指向的对象。

    shared_ptr允许多个指针指向同一个对象,unique则是独占所指向的对象,weak_ptr是一种弱引用,指向shared_ptr管理的对象。他们都定义在memory头文件中。

    shared_ptr类

    智能指针是模板,当我们创建一个智能指针时候,必须提供额外信息------指针可以指向的类型,与vector一样,我们在<>中给出类型,之后就是所定义的这种智能指针的名字:

    shared_ptr<string> p1;//shared_ptr可以指向string。

    shared_ptr<list<int>> p2;//shared_ptr可以指向int的list

    默认初始化时,它将是一个空指针。

    解引用一个智能指针返回他的指向对象。

    下面是shard_ptr和unique_ptr都支持的操作

    shared_ptr<T> sp;unique_ptr<T> up;//空智能指针,可以指向类型为T的对象

    p //将p作为一个条件判断,若p指向一个对象,则为true

    *p //解引用p,获得它指向的对象

    p->mem,//等价于(*p).mem;

    p.get()   //返回p中保存的指针,但是要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失。

    swap(p,q)//交换p和q的指针。

    p.swap(q)  //交换p和q的指针

    下面是shared_ptr独有的操作:

    make_shared<T>(args)  //返回一个shared_ptr,指向一个动态分配的类型为T的对象,使用args初始化此对象。

    shared_ptr<T>p(q);//p是shared_ptr q的拷贝;此操作会递增q中的计数器,q中的指针必须能转换为T。

    p = q //p和q都是shared_ptr,所保存的指针必须能相互转换,此操作会减少p的引用计数,若p的引用计数变为0,则将其管理的原内存释放。

    p.unique() //若p.use_count()为1,返回true;否则返回false;

    p.use_count(()// 返回与p共享对象的智能指针数量,可能很慢,主要用于调试。

    make_shared函数是最安全分配和使用动态内存的方法,此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。

    shared_ptr<int> p3 = make_shared<int>(42);//指向一个值为42的int的shared_ptr;

    shared_ptr的拷贝和赋值

    当进行拷贝和赋值时,每个shared_ptr都会记录有多少个其他shared_ptr指向相同的对象。

    auto p = make_shared<int>(42);//p指向的对象只有一个引用者;

    auto p(q);  //p和q指向相同的对象,此对象有两个引用者

  • 相关阅读:
    2020/12/27
    2020/12/25 the light
    2020/12/25
    2020/12/23
    2020/12/22
    美加大量银行用户遭攻击,这些黑客到底牛到什么程度?
    揭秘马云的蚂蚁科技“整改”计划
    大众集团成功研发:可移动的电动汽车充电器,网友:太方便了
    东方联盟郭盛华的江湖往事
    5种方法!疫情期间防御恶意软件,网络钓鱼和诈骗
  • 原文地址:https://www.cnblogs.com/NongSi-Net/p/5294698.html
Copyright © 2020-2023  润新知