C++基础知识点整理笔记(四)

这篇具有很好参考价值的文章主要介绍了C++基础知识点整理笔记(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

10. C++的内存管理

在C++中,内存被分成五个区:栈、堆、自由存储区、静态存储区、常量区

  • (一) 栈:存放函数的参数和局部变量,编译器自动分配和释放
  • (二) 堆:new关键字动态分配的内存,由程序员手动进行释放,否则程序结束后,由操作系统自动进行回收
  • (三) 自由存储区:由malloc分配的内存,和堆十分相似,由对应的free进行释放
  • (四) 全局/静态存储区:存放全局变量和静态变量
  • (五) 常量区:存放常量,不允许被修改

11. C++中内存泄漏的几种情况

内存泄漏是指己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。有以下几个原因:

  • 1)类的构造函数和析构函数中new和delete没有配套
  • 2)在释放对象数组时没有使用delete[],使用了delete
  • 3)没有将基类的析构函数定义为虚函数,当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确释放,因此造成内存泄露
  • 4)没有正确的清楚嵌套的对象指针

12. new、delete、malloc、free之间的关系

  • new/delete,malloc/free都是动态分配内存的方式;
  • new/delete是运算符,编译器保证调用构造和析构函数对对象进行初始化/析构,但是库函数malloc/free是库函数,不会执行构造/析构;
  • new会自动计算需分配的空间,malloc不行;
  • new是类型安全的,而malloc不是;
  • new返回指定类型指针,malloc返回void*指针,需要强制类型转换;
  • new可以被重载,malloc不能
  • new底层调用malloc函数分配内存,然后调用构造函数

13. delete和delete[]的区别

  • a) delete只会调用一次析构函数,而delete[]会调用每个成员的析构函数
  • b) 用new分配的内存用delete释放,用new[]分配的内存用delete[]释放

delete和delete[]是用于释放动态分配的内存的C++关键字,它们之间有一些重要的区别:

1. delete用于释放通过`new`分配的单个对象的内存,而delete[]用于释放通过`new[]`分配的数组的内存。

2. 释放数组必须使用delete[],而不能使用delete。因为对于使用`new[]`分配的动态数组,编译器在内存中存储了有关数组长度的额外信息,这样在释放数组时才能正确处理。

3. delete和delete[]的用法不同。delete用于对单个对象的指针进行释放,例如`delete obj;`。delete[]用于对数组的指针进行释放,例如`delete[] arr;`。

4. delete要求指针指向通过`new`分配的单个对象,而delete[]要求指针指向通过`new[]`分配的数组。如果不符合要求,行为是未定义的。

总结来说,delete和delete[]的最主要的区别在于对于动态数组的释放:delete用于释放单个对象的内存,而delete[]用于释放动态数组的内存,并且使用方式也不同。使用delete来释放通过new[]分配的数组会导致未定义行为,同样使用delete[]来释放通过new分配的单个对象也会出错。因此,为了避免内存泄漏和意外行为,需要正确选择delete或delete[]来释放对应的内存。文章来源地址https://www.toymoban.com/news/detail-607174.html

到了这里,关于C++基础知识点整理笔记(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C语言:数组、字符串知识点整理:

    补充 :数组长度= sizeof(arr)/sizeof(arr[0]) 注意: !!! 不适用于当arr 充当形参时(函数传参) !!! 因为函数 传递 的是 int arr[0] 的 地址(指针) ,而 不是数组内容 , 若在此情况计算整形数组长度         在X86系统下,指针大小为 4 ,所以计算结果为4/4=1;       

    2024年03月10日
    浏览(43)
  • 面试指南:C++之STL知识点

    相关系列文章 面试指南:C++之STL知识点 C++内存分配策略 深入理解STL空间分配器(一): new_allocator 深入理解STL空间分配器(二):mt_allocator 深入理解STL空间分配器(三):pool_allocator 深入理解STL空间分配器(四):bitmap_allocator 目录 1.讲讲STL的六大组件 2.vector 2.1.简单说说vector 2.2.vecto

    2024年02月21日
    浏览(32)
  • 【C++】如果你准备学习C++,并且有C语言的基础,我希望你能简单的过一遍知识点。

    相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili(1-83) 我的小站——半生瓜のblog 我知道这个视频早已经被很多人学习并且记录笔记,但是我还是想再过一遍前面的基础知识点,所以我这个笔记会非常的简洁,适合有C语言基础的小伙

    2024年02月01日
    浏览(39)
  • Java基础-知识点03(面试|学习)

    String 类是Java中用于表示字符串的类。在Java中,字符串是一系列字符的序列,用于表示文本数据。 String类的作用及特性 1、 创建字符串 : 可以通过字符串字面量或使用new来创建字符串对象。 2、 字符串长度 : 可以使用length()方法获取字符串的长度。 3、 字符串连接

    2024年04月15日
    浏览(41)
  • Java面试知识点(全)- Java面试基础部分一

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 语法基础 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联

    2024年02月05日
    浏览(32)
  • 《模拟电子技术》期末复习笔记4——上交大郑益慧课件知识点整理

    笔记整理自B站学习教程 《 模拟电子技术基础 上交大 郑益慧主讲 》 1904年,世界上第一只真空电子二极管在英国物理学家弗莱明的手下诞生,电子技术的时代开始了。为了提高性能, 1906年,美国发明家德福雷斯特做出了第一个三极管,这是电子技术工业革命开始的标志。从

    2024年02月02日
    浏览(64)
  • Spring Boot 基础知识点1 (含面试题1)

    Spring Boot 是一款基于 Spring 框架的开源应用程序开发工具,它旨在简化 Spring 应用程序的配置和开发过程。Spring Boot 提供了一种简单的方式来创建可独立运行的、生产级别的应用程序,并在需要时进行部署。Spring Boot 在微服务架构和云计算环境下得到了广泛应用。 本次主要是

    2024年01月25日
    浏览(26)
  • C++笔记(细碎小知识点)1

    2024年02月08日
    浏览(27)
  • 【C语言】指针知识点笔记(2)

    目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

    2024年01月18日
    浏览(33)
  • C++入门知识点——解决C语言不足

    😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥所属专栏:🔥魔王的修炼之路–C++🔥 如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的 点赞 👍和 关注 💖,支持一下博主

    2024年02月12日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包