c与c++的内存管理

news/2024/10/5 17:31:55/

给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)

当然也会看到别的定义如:

两者都正确,记那个都选,我选择的是第一个。 

再比如还有这样的分组: 这种分组是最正确的

开始我们先做一个题:

#include<iostream>
using namespace std;
int globalVar = 1;
static int staticGlobalVar = 1;
void test()
{static int staticVar = 1;int localVar = 1;int num1[10] = { 1,2,3,4,5,6,7,8,9,10 };char char2[] = "abcd";const char* pchar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4,sizeof(int));int* ptr3 = (int*)realloc(ptr2,sizeof(int) * 4);free(ptr1);free(ptr3);
}
int main()
{test();return 0;
}

 答案分别是  C C C A A       A   A   A   D   A  B

  40    5     4      4或8      4       4或8     (这里4或8,是因为其为指针,指针大小在32位电脑下指针的单位大小为4字节,64位下为8字节。)

 前五个空就不在解释了,直接从第六个空开始解释

第六个空:我们在创建char2的时候,会先在常量区上开辟空间,然后存储   abcd\0   然后再进行拷贝,将字符串拷贝到char2数组内后,就完成了对char2的创建,当然char2肯定是存在栈区上的。所以选A。

第七个空:根据上面的描述再栈区上创建了char2,又因为*char2就是a,所以*char2是存储在栈上的。所以还是选A。 

第八个空:pchar3在创建时,同样先会在常量区里面开辟空间存储  abcd\0,然后我们通过一个指针指向这段空间,所以pchar里面存的就是这个常量区的地址,又因为pchar3是一个指针,指针又存在栈上,所以我们就可以推出来pchar3是存储在栈上的。所以这个空填A。

 第九个空:根据我们上面的解释,pchar3自己本身是在栈上的,但是通过*解引用后,我们找到pchar3指针指向的空间,这个指向的空间存的是abcd\0,这几个字符我们上面解释了,是存在常量区内,所以这个空填D。

 填空二那就很简单了,这里提醒一点,温习一下sizeof与strlen的区别:

sizeof是计算其被计算的真实大小。

strlen是专门用来计算字符数组与字符串数组大小的库函数,他的计算标准是以我们指定的位置为起点,以'\0'为结束标识符结束。



 你知道malloc,calloc,realloc的三者区别么?

你知道malloc的实现原理么?

推荐视频:【CTF】GLibc堆利用入门-机制介绍_哔哩哔哩_bilibili



new/delete

c语言种我们在堆上开辟空间通常使用malloc,calloc,realloc。但在c++中是通过new出来对象。

所以就有一个笑话:你没有对象么?没有那我们就new一个出来。

这里我们先展示一下简单运用;

#include<iostream>int main()
{//动态开辟一个int类型的对象int* p1 = new int;//动态开辟一个int类型的空间并初始化为10int* p2 = new int(10);//动态申请10个int类型的空间int* p3 = new int[10];//在c语言中我们动态开辟后又free,同样在c++中也有操作符deletedelete p1;delete p2;delete []p3;//注意数组的要加[]return 0;
}

 

可见,new与c语言的malloc,calloc,realloc使用起来都差不多,

但是c++的new还有new出来自定义出来的类对象。 

#include<iostream>
using namespace std;
class A 
{
public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};
int main()
{// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构//造函数和析构函数A* a1 = new A(2);A* a2 = (A*)malloc(sizeof(A));free(a2);delete a1;return 0;
}

运行结果:

这是我们从直观观察到的差别,其实new与malloc还是又很大的差别的。

 

这一点我也不是特别懂,我就把我明确知道并且正确的说一下吧。然后提供更好的文章。

new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局 函数来释放空间。

优秀文章:

C++ 涨知识!new和delete知识总结(全面详细)_c++ new-CSDN博客


http://www.ppmy.cn/news/1473619.html

相关文章

代码随想录算法训练营第63天:图论[1]

代码随想录算法训练营第63天&#xff1a;图论 ‍ 图论理论基础 这一篇我们正式开始图论&#xff01; #图的基本概念 二维坐标中&#xff0c;两点可以连成线&#xff0c;多个点连成的线就构成了图。 当然图也可以就一个节点&#xff0c;甚至没有节点&#xff08;空图&…

2024年AI技术深入研究

2024年AI技术持续快速发展,应用领域广泛,产业发展迅速,市场趋势积极,学术研究深入。 AI技术进展大模型发展 2024年,智谱AI正在研发对标OpenAI Sora的高质量文生视频模型,预计最快年内发布。智谱AI的进展显示了国内AI大模型领域的快速发展,以及与国际领先技术的竞争态势…

uni-app x 跨平台开发框架

目录 uni-app x 是什么 和Flutter对比 uts语言 uvue渲染引擎 组合式API的写法 选项式API写法 页面生命周期 API pages.json全局配置文件 总结 uni-app x 是什么 uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 是一个庞…

【C++】多态(详解)

前言&#xff1a;今天学习的内容可能是近段时间最难的一个部分的内容了&#xff0c;C的多态&#xff0c;这部分内容博主认为难度比较大&#xff0c;各位一起慢慢啃下来。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23…

qt 播放相机的数据

在Qt中播放来自相机的实时视频数据通常需要使用QCamera类&#xff0c;这也是Qt Multimedia模块的一部分。以下是一个基本的步骤指南&#xff0c;用于在Qt应用程序中播放相机数据&#xff1a; 包含必要的头文件&#xff1a; #include <QCamera> #include <QCameraVie…

7 动态规划

下面的例子不错&#xff1a; 对于动态规划&#xff0c;能学到不少东西&#xff1b; 你要清楚每一步都在做什么&#xff0c;划分细致就能够拆解清楚&#xff01; xk. - 力扣&#xff08;LeetCode&#xff09; labuladong的算法笔记-动态规划-CSDN博客 动态规划是一种强大的算法…

【unity实战】使用旧输入系统Input Manager 写一个 2D 平台游戏玩家控制器——包括移动、跳跃、滑墙、蹬墙跳

最终效果 文章目录 最终效果素材下载人物环境 简单绘制环境角色移动跳跃视差和摄像机跟随效果奔跑动画切换跳跃动画&#xff0c;跳跃次数限制角色添加2d物理材质&#xff0c;防止角色粘在墙上如果角色移动时背景出现黑线条方法一方法二 墙壁滑行实现角色滑墙不可以通过移动离开…

路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划&#xff08;Matlab&#xff09; 1.利用蜣螂算法DBO优化栅格地图机器人路径规划&#xff0c;效果如图所示&#xff0c;包括迭代曲线图、栅格地图等等&#xff5e…