温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言和C++内存分配的实现

发布时间:2021-08-16 18:11:45 来源:亿速云 阅读:112 作者:chen 栏目:开发技术

本篇内容主要讲解“C语言和C++内存分配的实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言和C++内存分配的实现”吧!

目录
  • 1 内存分布图

  • 2 C语言和C++内存分配实现

    • 2.1 C语言实现

    • 2.2 C++实现

      • new的原理

      • delete的原理

  • 3 C语言和C++内存管理区别

    • 4 内存泄漏

      1 内存分布图

      C语言和C++内存分配的实现

      注意:

      1.向下生长:地址由高到低
      2.向上生长:地址由低到高
      3.栈又叫堆栈,非静态局部变量/函数参数/返回值等等
      4.堆用于程序运行时动态内存分配

      2 C语言和C++内存分配实现

      2.1 C语言实现

      malloc函数

       void *malloc(size_t size)

      分配所需的内存空间,单位是字节,并返回一个指向它的指针。

      int* ptr_int = (int*)malloc(4*sizeof(int));//开辟空间
      free(ptr_int);//释放空间

      calloc函数

      void *calloc(size_t nitems, size_t size)

      分配所需的内存空间,并返回一个指向它的指针。nitems – 要被分配的元素个数。size – 元素的大小。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。

      char* ptr_char = (char*)calloc(4, sizeof(char));
      free(ptr_char);

      realloc

      void *realloc(void *ptr, size_t size)

      尝试重新调整之前调用 malloc 或 calloc 所分配的ptr 所指向的内存块的大小。ptr – 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。

      size – 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。

      int* ptr_int = (int*)malloc(4*sizeof(int));
      char* ptr_char = (char*)calloc(4, sizeof(char));
      
      int* ptr_int1 = (int*)realloc(ptr_int, 8 * sizeof(int));
      char* ptr_char1 = (char*)realloc(ptr_char, 8 * sizeof(char));

      2.2 C++实现

      C语言和C++内存分配的实现

      new和delete的实现原理

      1 内置类型

      • 如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

      2 自定义类型

      new的原理

      1.调用operator new函数申请空间

      2.在申请的空间上执行构造函数,完成对象的构造

      delete的原理

      1.在空间上执行析构函数,完成对象中资源的清理工作

      2.调用operator delete函数释放对象的空间

      3 C语言和C++内存管理区别

      malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:

      1.malloc和free是函数,new和delete是操作符

      2.malloc申请的空间不会初始化,new可以初始化

      3.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可

      4.malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

      5.malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

      6.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

      4 内存泄漏

      什么是内存泄漏:

      内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

      内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

      堆内存泄漏(Heap leak)

      堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。

      系统资源泄漏

      指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

      到此,相信大家对“C语言和C++内存分配的实现”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

      向AI问一下细节

      免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

      AI