我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++内存管理如何理解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++内存管理如何理解

这期内容当中小编将会给大家带来有关C++内存管理如何理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

    前言;

    C++继承了C语言的指针,一直以来指针的一些问题困扰着开发人员,常见的指针问题主要有:内存泄露、野指针、访问越界等。值得庆幸的是C++标准委员会给我们提供了auto_ptr智能指针,后面又引入了share_ptr以及weak_ptr帮助我们正确和安全的使用指针,下面主要是介绍boost库提供的解决方案。

    1 smart_ptr概述

    在实际开发时,我们会根据不同的编程场景申请不同的资源,对于这些资源的管理需要一个完善的方案,我们希望在资源释放后,C++能够像java,c#一样不用去手动的释放资源而是由系统自动对资源进行回收。

    1.1 RAII进制

    C++编程时通常使用这种方法管理资源,申请的资源超过生命周期后,生命的对象自动调用析构函数对资源进行正确回收。如此看来,似乎是完美的解决我们的问题,至少在使用时不用手动释放资源。但是这种资源释放的方法同样存在着缺陷,如果对象是在栈上创建得到,那么会自动调用析构函数,结果也是没有问题的,但是如果对象是通过new在堆上创建的呢?结果是析构函数不能自动被调用,同样需要我们使用delete进行显示析构。如果程序在执行时没有调用析构delete进行释放资源,那么同样也会存在内存泄露的风险。

    new/delete在编程时一定要遵循配对原则,且要服从谁创建谁释放的规则,这一点不管是新手程序员还是有着丰富编程经验的老手都要认真对待。

    1.2 智能指针

    从C98开始,C++标准委员会就给我们提供了智能指针:auto_ptr。它部分解决了资源的自动释放问题。

    使用方法如下:

    std::auto_ptr<int> p (new int);

    auto_ptr的构造函数支持new操作符或者由对象工厂创建的对象指针作为参数。对象一经创建就托管了原始指针,因此它可以使用get方法返回指针对象,如:

    *p.get() = 100;

    auto_ptr受到了大家的欢迎,越来越多的人使用这种技术解决了实际编程中大部分得到资源管理的问题,但是,auto_ptr并不是一种非常完善的技术,也没有覆盖到智能指针的所有领域,尤其是引用计数型的智能指针。同理,在使用auto_ptr的时候也要注意以下几点,避免auto_ptr的滥用。

    • auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。

    • auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete

    • auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如share_ptr

    • auto_ptr不能作为容器对象。

    为了解决auto_ptr的不足,boost库提供了多种类之中从而完善了auto_ptr的不足。这些指针都在boost库的头文件中,

    如下所示:

    #include <boost/smart_ptr.hpp>using namespace boost;

    1.3 scoped_ptr

    该类型指针和auto_ptr类似,但是限制也更加严格,scoped_ptr对象一旦获取对象的管理权就将一直占用,不能在进行管理权转移。scoped_ptr像它的名字一样,只能在起作用域内进行使用。使用后会使得代码相对简单且不会增加多余操作。

    scoped_ptr使用方法:

    scoped_ptr使用简单,只需要在原来使用new的地方用scoped_ptr进行替换即可,

    使用方法如下:

    scoped_ptr<string> pStr(new string("hello word"));

    操作scoped_ptr指针也很简单,使用方式和普通指针一致,如:

    //打印指针指向字符串内容cout<<pAtr<<endl;//打印字符长度cout<<pAtr->size()<<endl;

    需要注意的是:1)此指针对象会进行自动释放,无需使用delete进行释放,如果在实际编程时使用了delete,编译器将会报错,大家不妨可以思考下原因是什么欢迎留言。2)scoped_ptr是不能进行赋值、拷贝操作得到,生命周期只限于声明的作用域内。

    和auto_ptr指针相比,scoped_ptr的不同点如下:

    两者都不能作为容器元素,但是原因却不同。auto_ptr是因为它自身的转义语义,但是scoped_ptr是因为不支持拷贝和复制。

    指针所有权不同,auto_ptr是可以进行转义得到,但是scoped_ptr不能进行转义,因为其构造和拷贝函数都是私有的。

    1.4 scoped_array

    scoped_arrayscoped_ptr基本相同,根本区别是scoped_array是指向数组的,封装了new[],弥补了指向数组的智能指针。

    scoped_array使用方法:

    scoped_array和scoped_ptr设计思想相同,使用方法也基本一致,如下:

    scoped_array<int> pIntArray(new int[10]);

    使用时需要注意的是:scoped_array不会对数组范围进行检查,且不能通过数组名+偏移的方式进行获取。

    但可以按照以下方式使用:

    pIntArray[0]=100;pIntArray[1]=200;1.5 shared_ptr

    shared_ptr已经被引入C++标准库中,功能强大,可以像普通指针那样使用,它是引用计数型指针,可以被任意的复制和拷贝。同时shared_ptr可以被用作容器元素。

    可以说shared_ptr是C++历史上实现智能指针算法中最杰出的代表作。

     shared_ptr使用方法:

    shared_ptr指针是最接近原始指针的。他比auto_ptrscoped_ptr应用范围更广,几乎可以百分之百避免程序中的内存泄露,但是使用却又像auto_ptr和scoped_ptr一样简单。

    shared_ptr是线程安全的,可以由多个线程进行读取。

    使用方式如下:

    int main(){    //定义一个指针对象   shared_ptr<int> pInt(new int);   //对指针进行赋值   *pInt = 100;   cout<<*pInt<<endl;   //调用shared_ptr重载方法   shared_ptr<int> pInt_cp = pInt;   cout<<*pInt_cp<<endl;   pInt.reset();   assert(!pInt);   return 0;}

    如上代码所示shared_ptr构造函数中依旧使用new的方法创建一个对象,但这个远远不够,shared_ptr提供make_shared方法来创建一个共享指针对象,

    方式如下:

    int main(){   shared_ptr<string> pStr= make_shared<string>("hello world");   cout<<*pStr<<endl;   shared_ptr<vector<int> > pVec = make_shared<vector<int> >(10,2);   cout<<pVec->size()<<endl;   return 0;}

    代码输出结果为:

    hello world
    10

    shared_ptr高级用法;

    shared_ptr 可以保存任意类型指针,可以理解成是改指针是泛型的。

    shared_ptr<void *>退出作用域后调用回调函数,如下:

    void fun(void *p){}shared_ptr<void *> p((void *0),fun);

    除此之外,shared_ptr还有其它很多高级用法,如:延时释放、包装成员函数等,感兴趣的话可以自行研究。

    1.6 shared_array

    shared_array功能和shared_ptr类似,根本区别是包装了new[]操作符,可以指向数组,知道引用计数为0时才会进行释放。

     shared_array使用方法:

    shared_arrayshared_ptrscoped_array的结合体。

    使用方法如下所示:

    int main(){   int *p = new int[100];   shared_array<int> sp(p);   shared_array<int> sp1=sp;   sp[0]=10;   return 0;}

    1.7 weak_ptr弱指针

    weak_ptr不具备普通指针的行为,需要和shared_ptr配合使用。主要用于协助shared_ptr工作,观测资源的使用情况。

     weak_ptr使用方法:

    weak_ptrshared_ptr共用可以通过shared_ptr或者weak_ptr对象构造,使用时不会产生引用计数增加,析构时也不会导致引用计数的减少。可以使用use_count查看引用计数,也可以使用其等效的方法expired(),如果引用计数为0则表示观测的对已经不存在了。代码示例如下:

    int main(){   shared_ptr<int> p(new int(100));   cout<<p.use_count()<<endl;   weak_ptr<int> wp(p);   cout<<wp.use_count()<<endl;   p.reset();   if(!wp.expired())   {       shared_ptr<int> p1=wp.lock();       *p1 = 1000;       cout<<wp.use_count()<<endl;   }   return 0;}

    上述就是小编为大家分享的C++内存管理如何理解了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    C++内存管理如何理解

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    C++内存管理如何理解

    这期内容当中小编将会给大家带来有关C++内存管理如何理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言;C++继承了C语言的指针,一直以来指针的一些问题困扰着开发人员,常见的指针问题主要有:内存泄露、
    2023-06-26

    如何进行C++内存管理?

    如何进行C++内存管理?C++是一种强大的编程语言,但是它也要求开发者负责内存管理。在C++中,内存管理是非常重要的,因为错误的内存使用可能导致内存泄漏、野指针和其他一系列问题。因此,对于C++开发者来说,掌握良好的内存管理技巧至关重要。C
    如何进行C++内存管理?
    2023-11-02

    C++ 内存管理如何与 C 语言的内存管理进行交互?

    c++++ 内存管理与 c 语言的交互:兼容性:c++ 与 c 语言兼容,可以使用 c 中的指针和数组。指针和数组:c++ 指针和数组与 c 语言中类似,但 c++ 允许通过指针直接操纵内存。动态内存分配:c++ 引入了 new 和 del
    C++ 内存管理如何与 C 语言的内存管理进行交互?
    2024-05-24

    C/C++的内存管理怎么理解

    这篇文章的内容主要围绕C/C++的内存管理怎么理解进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!C/C++内存分布int globalVar = 1
    2023-06-28

    【C++】C&C++内存管理

    就是你被爱情困住了?Wake up bro! 文章目录 一、C/C++内存分布二、C语言中动态内存管理方式三、C++中内存管理方式1.new和delete操作内置类型2.new和delete操作自定义类型(仅限vs的底层实现机制,
    2023-08-21

    如何有效处理 FaissJava 的内存管理?(如何处理FaissJava内存管理)

    在Java开发中,Faiss是一个强大的向量相似性搜索库。然而,对于FaissJava的内存管理,许多开发者可能会感到困惑和棘手。本文将详细介绍如何处理FaissJava的内存管理,帮助开发者更好地利用这个库。一、了解FaissJava的内存管
    如何有效处理 FaissJava 的内存管理?(如何处理FaissJava内存管理)
    Java2024-12-22

    【C++笔记】C++内存管理

    【C++笔记】C++内存管理 一、C++中动态内存申请的方式二、new和delete的实现原理2.1、operator new和operator delete函数 一、C++中动态内存申请的方式 在C语言中我们需要动态申请空
    2023-08-30

    如何理解Java代码的内存管理

    这期内容当中小编将会给大家带来有关如何理解Java代码的内存管理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。小编通过几个方面来介绍Java代码的内存管理。有的代码,GC根本就回收不了,直接系统挂掉。GC
    2023-06-17

    C++ 内存管理:理解指针和引用

    c++++内存管理依赖指针和引用来高效管理内存。指针存储其他变量的地址,允许间接访问和修改值;引用直接指向对象,不能重新分配。实战案例包括使用指针遍历数组和使用引用交换变量。最佳实践包括仅在需要修改值时使用指针,优先使用引用,并仔细管理指针
    C++ 内存管理:理解指针和引用
    2024-05-03

    如何理解Linux进程的内存管理

    这篇文章给大家介绍如何理解Linux进程的内存管理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。几个关键的数据结构一个进程的虚拟地址空间主要由两个数据结来描述,一个是 mm_struct,一个是 vm_area_str
    2023-06-15

    C++ 内存管理中的内存池

    内存池是一种 c++++ 技术,用于管理频繁分配和释放的特定大小对象。它使用预分配的内存块,提供比标准内存分配器更高的性能,特别是针对高度并发的应用程序。C++ 内存管理中的内存池内存池是一种用于优化内存分配和管理的 C++ 技术。它为频
    C++ 内存管理中的内存池
    2024-05-01

    如何进行C++代码的内存管理?

    如何进行C++代码的内存管理?C++是一种功能强大的编程语言,但同时也要求程序员自行管理内存。正确的内存管理是确保程序运行稳定和高效的关键之一。本文将介绍一些常见的内存管理技术和最佳实践,帮助初学者和有经验的开发人员更好地管理C++代码的内
    如何进行C++代码的内存管理?
    2023-11-03

    C++ 函数库如何进行内存管理?

    在 c++++ 中,内存管理由程序员负责。函数库提供了许多工具,包括:std::make_unique 和 std::make_shared:创建智能指针,自动释放内存。std::vector 和 std::array:动态分配和释放内存的
    C++ 函数库如何进行内存管理?
    2024-04-18

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录