C++系列-C/C++内存管理方式

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”  

C/C++内存分布

在这篇文章开始之前,我们先以一道题目来进行引入:

int glovalvar = 1;
static int staticGlovalvar = 1;
void Test()
{static int staticvar = 1;int localvar = 1;int num1[10] = { 1,2,3,4 };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);
}

1. 选择题:
选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)

globalVar在哪里?____ staticGlobalVar在哪里?____

staticVar在哪里?____ localVar在哪里?____

num1 在哪里?____

char2在哪里?____ *char2在哪里?___

pChar3在哪里?____ *pChar3在哪里?____

ptr1在哪里?____ *ptr1在哪里?____
2. 填空题:

sizeof(num1) = ____;

sizeof(char2) = ____; strlen(char2) = ____;

sizeof(pChar3) = ____; strlen(pChar3) = ____;

sizeof(ptr1) = ____;
 

3 sizeof 和 strlen 区别?

大家可以先想想,这些问题的答案是什么?

说明:

  • 又叫堆栈-非静态局部变量/返回值等等,栈是向下增长的。
  • 内存映射段,是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可使用系统接口创建共享内存,做进程间通信。
  • 用于程序运行时动态内存分配,堆是向上增长的。
  • 数据段-存储全局数据和静态数据
  • 代码段-可执行的代码/只读变量。

C++内存管理方式

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

new和delete的操作内置类型

int main()
{//内置类型int* p1 = new int;int* p2 = new int[10];return 0;
}

内置类型默认不初始化,但是,也可以进行初始化。

int main()
{内置类型//int* p1 = new int;//int* p2 = new int[10];int* p1 = new int(10);int* p2 = new int[10] {1, 2, 3, 4};//其余都是0delete p1;delete [] p2;return 0;
}

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

 为什么要匹配起来使用呢?我们后面再说。

我们可以看出来,当处理内置类型的时候,malloc和new是几乎没有任何区别的。

new和delete操作自定义类型

class A
{
public:A(int a = 0):_a(a){cout << "A(int a = 0)" << endl;}A(int a1, int a2){cout << "	A(int a1, int a2)" << endl;}A(const A& aa):_a(aa._a){cout << "	A(const A& aa)" << endl;}A& operator=(const A& aa){cout << "A& operator=(const A& aa)" << endl;if (this != &aa){_a = aa._a;}return *this;}~A(){cout << "~A()" << endl;}
private:int _a;
};
int main()
{//自定义类型,new才能调用构造初始化,malloc不能A* p1 = (A*)malloc(sizeof(A));free(p1);A* p2 = new A;A* p3 = new A(2);delete p2;delete p3;return 0;
}

我们可以从这段代码当中得出一个很重要的点,那就是malloc不能调用构造初始化,但是new可以

	//A* p4 = new A[10];//A aa1(1);//A aa2(2);//A aa3(3);//A* p4 = new A[10]{ aa1,aa2,aa3 };A* p4 = new A[10]{ 1,2,3,4,5,{6,7} };delete[] p4;

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java进阶学习笔记27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可变字符串对象&#xff0c;相当于一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a; StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;…

在CSDN上成长的感悟,你的粉丝长啥样?

文章目录 一、写作的初衷1. 记录所学内容2.巩固所学知识3.分享与帮助4.方便后续查找5.获取激励 二、你的粉丝长啥样&#xff1f;1. 粉丝的特点与困惑2. 关于粉丝&#xff0c;细思极恐 三、继续前行、坚持初心 在CSDN上写博文&#xff0c;对于我来说&#xff0c;不仅仅是一个记录…

OTA在线旅行社系统架构:连接世界的科技纽带

随着互联网的快速发展和人们对旅行需求的不断增长&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在线旅行社成为了现代旅行业中的重要一环。OTA系统架构的设计和实现将对旅行行业产生深远影响。本文将探讨OTA在线旅行社系统架构的重要性和关键组成部分&#xff…

异构图上的连接预测一

这里写目录标题 异构图&#xff1f;处理数据&#xff1a; 异构图&#xff1f; 异构图&#xff1a;就是指节点与边类型不同的图。 连接预测&#xff1a;目的是预测图中两个节点之间是否存在一条边&#xff0c;或者是预测两个节点之间&#xff0c;在未来可能形成的连接。 eg&…

Linux系统如何通过编译方式安装python3.11.3

1.切换到/data 目录 cd /data 2.下载python源码Python-3.11.3.tgz wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz tar -xzf Python-3.11.0.tgz cd Python-3.11.3 3.配置python的安装路径 和 执行openssl的路径 ./configure --prefix/usr/local/pyth…

Java筑基(三)

Java筑基&#xff08;三&#xff09; 一、final概念1、案例1&#xff1a;采用继承&#xff1a;2、案例2&#xff1a;final修饰的类不可以被继承&#xff1a;3、案例3&#xff1a;final修饰的类不能有子类&#xff0c;但是可以有父类4、final修饰构造方法5、final修饰普通方法6、…

头歌GCC编程工具集第1关:实验工具GCC与objdump的使用

任务要求 根据提示&#xff0c;在右侧编辑器中显示的bytes.c文件中的 Begin-End 之间补充代码&#xff08;即设置一个数组的初始值&#xff09;&#xff0c;使其与如下显示的main.c文件一起编译、生成的程序在运行时输出“SUCCESS”。 程序源文件main.c的内容如下&#xff08;务…

牛客前端面试高频八股总结(1)(附文档)

1.html语义化 要求使用具有语义的标签&#xff1a;header footer article aside section nav 三点好处&#xff1a; &#xff08;1&#xff09;提高代码可读性&#xff0c;页面内容结构化&#xff0c;更清晰 &#xff08;2&#xff09;无css时&#xff0c;时页面呈现出良好…

渗透工具CobaltStrike工具的下载和安装

一、CobalStrike简介 Cobalt Strike(简称为CS)是一款基于java的渗透测试工具&#xff0c;专业的团队作战的渗透测试工具。CS使用了C/S架构&#xff0c;它分为客户端(Client)和服务端(Server)&#xff0c;服务端只要一个&#xff0c;客户端可有多个&#xff0c;多人连接服务端后…

Golang设计模式(四):观察者模式

观察者模式 什么是观察者 观察者模式(Observer Pattern)&#xff1a;定义对象之间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅&#xff08;Publish/Subscribe&#xf…

音视频开发8 音视频中SDL的使用,SDL 在windows上环境搭建,SDL 使用 以及 常用 API说明,show YUV and play PCM

1.SDL简介 SDL&#xff08;Simple DirectMedia Layer&#xff09;&#xff0c;是一个跨平台的C语言多媒体开发库。 支持Windows、Mac OS X、Linux、iOS、Android 提供对音频、键盘、鼠标、游戏操纵杆、图形硬件的底层访问 很多的视频播放软件、模拟器、受欢迎的游戏都在使用…

面试中算法(A星寻路算法)

一、问题需求&#xff1a; 迷宫寻路游戏中&#xff0c;有一些小怪物要攻击主角&#xff0c;现在希望你给这些小怪物加上聪 明的AI (Artificial Intelligence&#xff0c;人工智能&#xff09;&#xff0c;让它们可以自动绕过迷宫中的障碍物&#xff0c;寻找到主角的所在。 A星…

json web token及JWT学习与探索

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案 作用&#xff1a; 主要是做鉴权用的登录之后存储用户信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

Django使用fetch实现登录

Django使用session管理&#xff08;cookie&#xff09;实现了一个用户登录和会话保持功能。如果需求不太复杂可以使用Django默认的登录功能。 1 安装django-cors-headers 首先需要安装django-cors-headers pip install django-cors-headers2 在settings中配置 需要按照djan…

用Dockerfile和Shell脚本来部署一个Go项目

如何使用Dockerfile和Shell脚本来部署一个Go项目。这种方法能够帮助我们自动化构建、测试和部署流程&#xff0c;提高开发效率。 **一、项目结构和代码** 首先&#xff0c;我们需要准备一个Go项目。假设我们的项目结构如下&#xff1a; my-go-app/ ├── main.go ├── D…

1107 老鼠爱大米

solution 记录每组的最大值&#xff0c;并比较组间的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

【C/C++】Makefile文件的介绍与基本用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

第三周:从错误中认识到管理

1. 约定两周时间&#xff0c;完成这个功能 在管理者分配好项目任务后&#xff0c;只是口头约定两周的时间&#xff0c;没有形成需求文档。对于需求&#xff0c;人与人的理解是不一样的&#xff0c;有些太过于抽象的东西&#xff0c;太难以描绘&#xff0c;只能一而再再而三的确…

【论文复现】LSTM长短记忆网络

LSTM 前言网络架构总线遗忘门记忆门记忆细胞输出门 模型定义单个LSTM神经元的定义LSTM层内结构的定义 模型训练模型评估代码细节LSTM层单元的首尾的处理配置Tensorflow的GPU版本 前言 LSTM作为经典模型&#xff0c;可以用来做语言模型&#xff0c;实现类似于语言模型的功能&am…

vue3的proxy如何取代object和defineproperty

在 Vue 2.x 中&#xff0c;为了响应式地追踪对象属性的变化&#xff0c;Vue 使用了 Object.defineProperty 方法。但是&#xff0c;Object.defineProperty 有一些限制&#xff0c;比如它不能追踪属性的添加或删除&#xff0c;也不能直接用于数组或对象原型链上的属性。 Vue 3.…