【C++系列P6】C/C++的内存管理(超细超有料!YY打包票!)

这篇具有很好参考价值的文章主要介绍了【C++系列P6】C/C++的内存管理(超细超有料!YY打包票!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++系列P6】C/C++的内存管理(超细超有料!YY打包票!)

前言

  • 大家好吖,欢迎来到 YY 滴 C++系列 ,热烈欢迎!
  • 本章主要内容面向接触过C++的老铁,主要内容含

【C++系列P6】C/C++的内存管理(超细超有料!YY打包票!)

目录

一.C/C++的内存管理

1.C/C++的内存分布规则

一.易错点:数组存储字符串和指针指向字符串,解引用后所在的位置不同(含例题)

2.C/C++的内存管理方式

一.使用new和delete操作符的使用规范

二.new和delete对内置类型的具体使用场景

三.new和delete对自定义类型的具体使用场景

四.new/delete与malloc/free的底层区别(自定义类型演示)

 五. new/delete与malloc/free在使用失败时的区别


一.C/C++的内存管理


1.C/C++的内存分布规则

  1. 又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
  3. 用于程序运行时动态内存分配,堆是可以上增长的。
  4. 数据段--存储全局数据和静态数据。
  5. 代码段--可执行的代码/只读常量。

图示: 

【C++系列P6】C/C++的内存管理(超细超有料!YY打包票!)


一.易错点:数组存储字符串和指针指向字符串,解引用后所在的位置不同(含例题)

  • *char2数组所在的位置是栈,是位于代码段(常量区)"abcd\0"的一份拷贝;
  • pChar3是一个指向代码段(常量区)"abcd\0"的一个指针变量,由于其具有常性,所以要加上const;

图示:

【C++系列P6】C/C++的内存管理(超细超有料!YY打包票!)


2.C/C++的内存管理方式

PS:C的内存管理有malloc/calloc/realloc/free(可见博主C专栏:动态内存管理)  

引入:C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过newdelete操作符进行动态内存管理。一般C与C++内存管理不混用)


一.使用new和delete操作符的使用规范

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[],要匹配起来使用(如果new后接free,无论是否是对同一块空间的操作,都容易报错)

代码演示:文章来源地址https://www.toymoban.com/news/detail-474093.html

//报错
int* p3 = (int*)malloc(sizeof(int)); // C
int* p4 = new int;
free(p4);           对开辟同一块空间操作,不匹配
delete p3;

//报错
int* p3 = (int*)malloc(sizeof(int)); // C
int* p4 = new int;
free(p3);           对开辟不同一块空间操作,不匹配
delete p4;

二.new和delete对内置类型的具体使用场景

使用场景:

  • 申请一个int类型空间(调用构造,随机值)
  • 申请一个int类型空间,并初始化为10
  • 申请10个int类型空间
  • 申请10个int类型空间,并分别初始化

代码演示:

void Test()
{
  // 动态申请一个int类型的空间
  int* ptr4 = new int;
  // 动态申请一个int类型的空间并初始化为10
  int* ptr5 = new int(10);
  // 动态申请10个int类型的空间
  int* ptr6 = new int[10];
  // 动态申请10个int类型的空间,并初始化
  int* ptr7 = new int[10]{1,3,4};
  delete ptr4;
  delete ptr5;
  delete[] ptr6;
}

三.new和delete对自定义类型的具体使用场景

使用场景:有一个自定义类型A,他的初始化列表需要传入两个参数

  • 申请一个空间给A
  • 申请一个4个空间给4个A,分别初始化(多参,不可不完全初始化)

代码演示:

void test()
{
  A* p1 = new A(1,1);
  delete p2;

  //错误写法:不完全初始化  A* p2 = new A[4]{ A(1,1),A(2,2),A(3,3)};
  A* p2 = new A[4]{ A(1,1),A(2,2),A(3,3),A(4,4) };
  delete[] p2;
}

四.new/delete与malloc/free的底层区别(自定义类型演示)

new/delete 和 malloc/free根本区别: 

  • new的底层其实也是malloc与malloc不同之处在于他会调用拷贝构造
  • delete的底层其实也是free与free不同之处在于他会调用析构函数

实例分析:(顺序)

  • 在下图中,new了一个栈Stack,其实底层是malloc个空间给Stack(自定义类型)调用它的拷贝构造(_array指向的新空间)
  • 当delete栈Stack时,调用析构函数(free掉刚刚_array指向的新空间再free掉Stack所处的空间;
  • PS:如果不是这样,而是先free掉Stack的空间,那么_array指向的新空间将无法被p1找到,造成内存泄漏

图演示: 

【C++系列P6】C/C++的内存管理(超细超有料!YY打包票!)


 五. new/delete与malloc/free在使用失败时的区别

  • C++是一门面向对象的语言,处理失败时,不喜欢用返回值,更喜欢用抛异常
  • 一般用【try-catch捕捉

代码演示:

    try
  {
	do
	{
		//p1 = (int*)malloc(1024 * 1024);
		p1 = new int[1024 * 1024];
		cout << p1 << endl;
	} while (p1);
  }
catch (const exception& e)
{
	cout << e.what() << endl;
}

到了这里,关于【C++系列P6】C/C++的内存管理(超细超有料!YY打包票!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++内存管理(3)——内存池

    利用默认的内存管理操作符 new/delete 和函数 malloc()/free() 在堆上分配和释放内存会有一些额外的开销。 系统在接收到分配一定大小内存的请求时,首先查找内部维护的内存空闲块表,并且需要根据一定的算法(例如分配最先找到的不小于申请大小的内存块给请求者,或者分配

    2024年02月09日
    浏览(42)
  • C++——内存分配与动态内存管理

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月17日
    浏览(56)
  • 【C++】C++内存管理,模板

    C++中通过 new 和 delete 两个操作符实现动态内存管理 为自定义类型设计,可以在申请空间得同时初始化 使用 new 先申请空间,再调用构造 使用 delete 时先调用析构,再释放空间 operator new 和 operator delete 是系统提供的全局函数,不是运算符重载, 在使用 new 或 delete 时,底层实

    2024年02月01日
    浏览(43)
  • c++ 内存管理一:初识内存分配工具

    前言 侯捷 c++内存管理学习总结笔记。 在C++中,有几种常用的内存分配工具可以帮助进行动态内存管理。 从c++应用程序自上而下,通常会有这样的几种分配内存的方式,当然最终都是直接或间接的调用系统的API。 1 new 和 delete new 和 delete :new操作符用于在堆上分配内存,de

    2024年02月11日
    浏览(45)
  • 【Linux系列P6】自动化构建工具-make/Makefile详解

     前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门!  订阅专栏阅读:YY的《Linux》系列 ❀❀❀❀❀ 【Linux系列-P1】 Linux环境的搭建 【Linux系列-P2】Linux的基本知

    2024年02月16日
    浏览(38)
  • 【C++初阶】七、内存管理(C/C++内存分布、C++内存管理方式、operator new / delete 函数、定位new表达式)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】六、类和对象(初始化列表、static成员、友元、内部类)-CSDN博客  ==================

    2024年02月05日
    浏览(45)
  • 【闪击Linux系列P6】自动化构建工具-make/Makefile详解

     前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门!  订阅专栏阅读:YY的《Linux》系列 ❀❀❀❀❀ 【Linux系列-P1】 Linux环境的搭建 【Linux系列-P2】Linux的基本知

    2024年02月13日
    浏览(39)
  • C++动态内存管理+模板

    💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 C++👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大家三连关注,一起学习,一起进步!!💓 C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使

    2024年02月09日
    浏览(45)
  • 【C++初阶】动态内存管理

      说明: 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的; 2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口     创建共享共享内存,做进程间通信; 3. 堆用于程序运行时动态内存分配,堆是可以上增长的;

    2024年02月06日
    浏览(41)
  • 【C++】——动态内存管理

      目录 🌞导读 🌔C/C++内存分布  🌔C++内存管理方式  🌗new/delete操作内置类型  🌗new和delete的使用方法 🌔operator new与operator delete函数 🌔new和delete的实现原理 🌗内置类型 🌗自定义类型 🌔定位new表达式  🌗使用格式 🌔malloc/free和new/delete的区别 🌟作者简介: 日出等日

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包