纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

C++内存管理 浅谈C++内存管理基础知识

胡代洲   2021-11-18 我要评论
想了解浅谈C++内存管理基础知识的相关内容吗胡代洲在本文为您仔细讲解C++内存管理的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C++基础,C++内存管理下面大家一起来学习吧。

概述

内存管理的原理庞大而复杂然而这些都被操作系统进行了封装并对外预留了API这些api被c++调用同时也被c++再次进行了封装再面向程序员预留出了语法特性的接口作为使用c++的程序员我们只需要掌握c++预留的内存管理特性即可就像我们开车不需要管变数箱、发动机是怎么变速、点火的我们只需要掌握汽车给我们预留的接口方向盘、刹车、油门如何使用即可。

c++程序容易出bug主要就是因为内存管理部分的复杂性 ,java、python等语言提供了更多的封装所以降低了程序员的操作难度和犯错的可能。就像自动档的汽车一样没有了离合自然就不会因操作失误把变速箱损坏。

c++可用内存

c语言的可用内存

在c语言中我们的可用内存主要分以下几个区域:

  • 栈用于存放局部变量。
  • 全局数据区/静态数据区用于存放全局变量和静态局部变量。
  • const数据区该区域在内存中实际是没有指定分区的他存在于全局数据区或者栈中const不能被修改是被编译器限制的在物理内存中根本就没有只读类型的内存。所以有时候我们在讨论分区的时候不会提到const区因为他根本就没有独立存在。
  • 代码段当然是用来存放代码在linux下我们的可执行代码从rom中读取到内存中执行虽说内存可读可写但是在操作系统的监控下这段内存也是只读不写的区域。
  • 堆c中的堆由malloc申请free释放底层也是由操作系统提供给我们的程序的一段内存。

c++新增内存区域

c中的内存分区在c++中全部都存在而c++新增了自由存储区使用new来申请delet来释放实际和malloc申请的内存在一个区域new使用内存示例如下:

int *p = new int;
*p=6;
cout << "*p=" << *p << endl;
delete p;

new和malloc

linux平台中new内部其实还是通过malooc来申请的内存只是附加做了些其他工作例如调用类的构造函数来初始化。malloc返回的就像一块荒地需要你自己来规划而new返回的是一个修好基建的区域给你。

malloc

new

c库函数

运算符、关键字

分配空间由传参决定

大小由数据类型决定编译器自动计算

返回值void *

明确的类型申请啥返回啥

free释放

delete、delet[ ]释放

申请内存不初始化

可以隐式和显示初始化

无构造函数

执行构造函数

申请失败返回NULL

申请失败返回bad_alloc异常

智能指针引入

我们说cpu决定了汇编指令、汇编决定了c和c++所以c/c++的指针是天然的用来支持汇编的间接寻址可以说是cpu决定的指针。所以指针是无法避开的指针的优势是太灵活劣势也是太灵活尤其是与动态内存、构造、析构结合使用后容易出错所以c++发明了一种智能指针有程序员和专门设计的自动管理机制共同把控以减少出错。这种自动管理机制在c中就有体现如栈就是自动管理的结果。

智能指针是普通指针的升级版本身具备指针的功能且多出一些自动释放资源的机制当然智能指针的使用会比普通指针要多消耗一些资源和开销。在c++中智能指针不是唯一的有很多类型的智能指针各有优劣和适应的场景。使用智能指针时须按照设计正确使用否则容易导致灾难。

智能指针的实现

将普通指针封装为栈式复合指针对象内部包含了除了真正指向目标的指针外还有些其他东西如使用次数记录等要使用智能指针我们需要注意以下问题:

  • 将智能指针本身定义为局部(栈上)实现指针本身被自动回收的。
  • 智能指针内部设计为当指针本身要被弹栈释放时执行事先挂接好的清理函数也就是说智能指针内部应该有一个函数指针指向我们的清理函数。
  • 智能指针需要使用库为其提供的方法和运算符来重载使用。

java延伸

java语言整体框架

为了保证知识的完整我们简单的介绍一下java的内容来了解一些优质方法。

cpu ->系统内核 -> 应用层框架 -> java虚拟机 -> Java字节码 -> java源码

从上面的架构我们能看出来java比c/c++多了三层java的源码编译输出的并不是cpu可执行的机器码而是被编译成java字节码这个东西完全是java自己定义的一种东西只能在JVM(java虚拟机)上运行 JVM再基于一些内核提供的框架来运行所以说java是一种解释性语言他完全靠JVM进行解释而c/c++是编译型语言源码直接编译成cpu可执行的机器码。正因为有了JVM所以java可以跨平台运行哪里有JVM哪里就可以运行java前提是不同平台的JVM能相互兼容java的运行稳定性取决于JVM。

java的垃圾回收机制

java有一个专门做垃圾回收的守护进程GC线程他内部使用GC机制和算法来得到生命周期结束的变量对象把这些对象当成垃圾进行回收。

实际上垃圾回收并不是java的专利其他语言如c#也有类似的设计理念典型的就是他们都没有指针其垃圾回收机制让程序员免于考虑对象的生命周期和资源的申请与释放使得这门语言非常好学其实垃圾回收机制的背后都是以效率和内存资源为代价换来的不易出错简单好用。

总结

本篇文章就到这里了希望能够给你带来帮助也希望您能够多多关注的更多内容!


相关文章

猜您喜欢

  • pycharm使用tensorflow 教你在pycharm中使用tensorflow的方法

    想了解教你在pycharm中使用tensorflow的方法的相关内容吗白速龙王的回眸在本文为您仔细讲解pycharm使用tensorflow的相关知识和一些Code实例欢迎阅读和指正我们先划重点:pycharm使用tensorflow,pycharm,tensorflow下面大家一起来学习吧。..
  • Python绘制多角星 Python实现绘制多角星实例

    想了解Python实现绘制多角星实例的相关内容吗邓雪婷在本文为您仔细讲解Python绘制多角星的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python实现绘制多角星,Python绘制多角星实例,Python绘制多角星下面大家一起来学习吧。..

网友评论

Copyright 2020 www.tdogsoftware.com 【零度软件园】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式