【C++杂货铺】内管管理

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

【C++杂货铺】内管管理,C++杂货铺,c++,开发语言,面试,经验分享,c语言,学习


目录

🌈前言🌈

📁 C/C++中内存分布

📁 new 和 delete的使用

📁 new 和 delete的优点

📁 new 和 delete的原理

 📂 operator new 和 operator delete函数

 📂 内置类型

 📂 自定义类型

📁 内存泄漏

📁 总结


🌈前言🌈

        欢迎收看本期【C++杂货铺】,本期内容讲解C++内存管理。包含了C++中内存分布情况,如何进行内存管理,使用new和delete操作符开辟/释放空间等,此外将介绍C++中new 和 delete的优点和原理。

        此外,本期内容可能会涉及到类和对象的部分概念,如果你还不是很了解,可以快速阅览以下文章:

【C++杂货铺】详解类和对象 [上]-CSDN博客

【C++杂货铺】详解类和对象 [中]-CSDN博客

【C++杂货铺】详解类和对象 [下]-CSDN博客

【C++杂货铺】内管管理,C++杂货铺,c++,开发语言,面试,经验分享,c语言,学习

📁 C/C++中内存分布

        程序运行会被加载到内存,程序的代码和数据则会在内存中存储在不同地方,通过内存地址进行访问。

        内存地址是计算机中用来标识存储单元位置的一个唯一的数字。在计算机中,每个存储单元都有一个唯一的地址,通过这些地址可以访问和操作存储器中的数据。内存地址通常用十六进制表示。

        为了方便管理不同的类型的数据,如全局变量和局部变量,就会在内存中划分出不同区域。

当然这只是简单的了解一下内存分布,如果你学过操作系统的内容,你就会知道,C/C++中的内存概念其实都是虚拟内存,不是真实的物理内存。

【C++杂货铺】内管管理,C++杂货铺,c++,开发语言,面试,经验分享,c语言,学习

        上图中,不同书籍可能会有偏差,如果只学过语言,只需要知道有栈,堆,数据段,代码段即可。其中栈存放局部变量,形参等数据,堆则是由程序员自己手动开辟,存放数据。

        所以,堆区则是我们进行内存管理的区域了。

📁 new 和 delete的使用

        学过C语言可能知道,想要在C语言中开辟内存空间需要使用malloc函数,释放资源使用free函数。

        下图是malloc和free函数的使用示例。

开辟1个int类型数据的空间
int* pa = (int*)malloc(sizeof(int));
if(pa == NULL )
    return 1;

free(pa);

开辟10个int类型数据的空间
int* parr = (int*)malloc(sizeof(int) * 10 );

释放连续地址空间只需要给出首元素地址即可
free(parr);

        我们可以看出使用malloc函数非常的不方便,例如只开辟空间,不能完成初始化;需要手动判断内存是否开辟成功。

        此外,最重要的是,对于自定义类型,是需要构造函数初始化,但是malloc开完空间后,不能调用构造函数。

        所以C++语言就引入了两个操作符new 和 delete。

        下图是new 和 delete操作符的使用示例。

int* pa = new int;
delete pa;

int* parr = new int[10];
delete[] parr;
        申请和释放单个元素的空间,使用 new delete 操作符,申请和释放连续的空间,使用 new[] delete[] ,注意:匹配起来使用

【C++杂货铺】内管管理,C++杂货铺,c++,开发语言,面试,经验分享,c语言,学习

📁 new 和 delete的优点

        上文中,我们已经知道了new 和 delete 操作符的部分优点:

1. 编译器会自动检查内存空间是否成功开辟,如果失败,则会抛异常。

2. 可以完成初始化的工作。对于自定义类型,会调用它的构造函数和析构函数。

int* pa = new int(1);

//如果是不完全初始化,后面会用0代替。
int* parr = new int(10){1,2,3,4,5};

📁 new 和 delete的原理

        以上我们简单了解了new和delete操作符的基本使用,想要彻底掌握,我们就从底层了解new和delete的区别以及底层实现。

 📂 operator new 和 operator delete函数

        new 和 delete是用户进行动态内存申请和释放的操作符,operator new 和 operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete底层通过operator delete全局函数来释放空间

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间
失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
// try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
  if (_callnewh(size) == 0)
     {
         // report no memory
         // 如果申请内存失败了,这里会抛出bad_alloc 类型异常
         static const std::bad_alloc nomem;
         _RAISE(nomem);
     }
return (p);
}
/*
operator delete: 该函数最终是通过free来释放空间的
*/
void operator delete(void *pUserData)
{
     _CrtMemBlockHeader * pHead;
     RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
     if (pUserData == NULL)
         return;
     _mlock(_HEAP_LOCK);  /* block other threads */
     __TRY
         /* get a pointer to memory block header */
         pHead = pHdr(pUserData);
          /* verify block type */
         _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
         _free_dbg( pUserData, pHead->nBlockUse );
     __FINALLY
         _munlock(_HEAP_LOCK);  /* release other threads */
     __END_TRY_FINALLY
     return;
}
/*
free的实现
*/
#define   free(p)               _free_dbg(p, _NORMAL_BLOCK)

        通过两个全局函数的实现就知道了,operator new 实际通过malloc来申请空间,如果malloc申请成功直接返回(原地扩容),否则执行用户提供的空间不足的措施(异地扩容),如果用户提供改措施,则会继续申请,否则抛异常。

         operator delete 最终通过free来释放空间。

 📂 内置类型

        如果申请的是内置类型的空间(int , double,指针...),new和malloc ,delete和free基本类似,不同之处在于:new 和 delete 是申请和释放单个元素空间,new[]和delete[]申请的是连续空间,释放连续的空间。而且new申请空间时会抛异常,malloc则会返回NULL。

 📂 自定义类型

        ● new的原理

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

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

        ● delete的原理

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

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

        ● new[ ]的原理 

        1. 调用operator new[ ]函数,在operator new[ ]中实际调用operator new函数完成 N个对象空间的申请。

        2. 在申请空间上调用N次构造函数。

        ● delete[ ]的原理

        1. 在释放对象的空间上进行N次析构函数,完成N个对象中资源的清理。

        2. 调用operator delete[ ]释放资源,实际在operator delete[ ]中调用operator delete[ ]了释放空间。

📁 内存泄漏

        什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
        内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

        

📁 总结

        以上,就是本期【C++杂货铺】内存管理的主要内容了,主要介绍了new和delete操作符的使用,有点及其底层原理。

        此外,简单介绍了C/C++中内存分布情况,以及内存泄露的基本概念和危害。

        如果感觉本期内容对你有帮助,欢迎点赞,收藏,关注Thanks♪(・ω・)ノ

【C++杂货铺】内管管理,C++杂货铺,c++,开发语言,面试,经验分享,c语言,学习文章来源地址https://www.toymoban.com/news/detail-850714.html

到了这里,关于【C++杂货铺】内管管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【C++杂货铺】拷贝构造函数

    📖 定义 拷贝构造函数 是构造函数的一个重载 ,它的本质还是 构造函数 ,那就意味着,只有在创建对象的时候,编译器才会自动调用它,那他和普通的构造函数有什么区别呢? 拷贝构造函数,是创建对象的时候,用一个已存在的对象,去初始化待创建的对象 。简单来说,

    2024年02月16日
    浏览(52)
  • 【C++杂货铺】详解list容器

    目录 🌈前言🌈 📁 介绍 📁 使用  📂 构造  📂 迭代器iterator  📂 capacity  📂 modifiers  📂 迭代器失效 📁 模拟实现  📂 迭代器的实现 📂 代码展示 📁 和vector的区别 📁 总结         欢迎收看本期【C++杂货铺】,本期内容将讲解STL中关于list的内容,会分为一下几个方

    2024年04月14日
    浏览(52)
  • 【C++杂货铺】运算符重载

    本文将以日期类为基础,去探寻运算符重载的特性与使用方法,下面先给出日期类的基础定义: 备注 :拷贝构造函数和析构函数,均可以不写,因为当前日期类的三个成员变量都是内置类型,没有动态申请空间,使用浅拷贝就可以。 📖 如何比较两个日期的大小? 现如今,

    2024年02月16日
    浏览(73)
  • 【C++杂货铺】缺省参数、函数重载

     缺省参数是 声明或定义函数时为函数的参数指定一个缺省值 。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。  上面代码在 fun 函数的形参部分给了缺省值10,这意味着在调用 fun 函数的时候可以传参,也可以不传参,如果传参了那形参

    2024年02月16日
    浏览(38)
  • 【C++杂货铺】C++介绍、命名空间、输入输出

     C语言是 结构化 和 模块化 的语言,适合处理 较小规模 的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了 OOP (object oriented programming: 面向对象 )思想,支持面向对象的程序设计语言应

    2024年02月16日
    浏览(42)
  • 【C++杂货铺】再谈类和对象

    在创建对象的时候,编译器通过调用构造函数,在构造函数体中,给对象中的各个成员变量一个合适的初值。 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初

    2024年02月16日
    浏览(40)
  • 【C++杂货铺】string使用指南

    2024年02月14日
    浏览(45)
  • 【C++杂货铺】初识类和对象

    📖 面向过程 C语言是 面向过程的 ,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。以洗衣服这件事为例,下图是C语言完成洗衣服这件事的过程。 📖 面向对象 C++是 基于面向对象的 ,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完

    2024年02月16日
    浏览(52)
  • 【C++杂货铺】探索string的底层实现

    string 本质上是一个动态顺序表,它可以根据需要动态的扩容,所以字符串一定是通过在堆上动态申请空间进行存储的,因此 _str 指向存储字符串的空间, _size 用来表示有效字符数, _capacity 用来表示可以存储有效字符的容量数。 注意 :默认构造函数需要注意的地方是:首先

    2024年02月11日
    浏览(44)
  • 【C++杂货铺】探索vector的底层实现

    STL(standard template libaray-标准模板库): 是C++标准库的一部分 ,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架 。 原始版本 :Alexander Stepanov、Meng Lee在惠普实验室完成的版本,本着开源精神,它们声明允许任何人任意运用、拷贝、修改、传播、商业使

    2024年02月11日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包