C/C++的内存管理(1)

news2024/11/5 18:32:23

内存管理

  • C与C++的内存分布
  • C语言中动态内存管理方式回顾
  • C++内存管理的方式

C与C++的内存分布

我们学习C语言时就知道,储存不同的变量计算机会相应分配不同区块的内存。那为什么要把内存化为不同的区域呢?实质上是为了方便管理
下面我们来看看下面一道例题,看看C语言阶段的内存管理学习的怎么样?

int globalVar = 1;
static int staticGlobalVar = 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);
}

题目
选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
globalVar在哪里?____ staticGlobalVar在哪里?____
staticVar在哪里?____ localVar在哪里?____
num1 在哪里?____

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

要解决这个问题,我们不妨先来回顾一下C\C++的内存分布:
在这里插入图片描述
栈:向下增长;且储存局部变量、函数的参数、返回值等等。
堆:向上生长;主要是动态开辟的内存,用完需要用户自己销毁的空间,因此这一块空间需要我们重点关注
数据段(静态区):主要储存全局变量与静态变量
代码段(常量区):主要储存可执行代码与常量。
有了这样的认识那题目自然也就会做了
在这里插入图片描述
因此题目答案:CCCAA /AAADAB

C语言中动态内存管理方式回顾

1.malloc/calloc/realloc的区别

  1. malloc与realloc、calloc的参数不同
    2)malloc只能用于开辟空间,calloc与realloc可用于开辟空间与扩容
    3)calloc除了开辟空间与扩容还有初始化的作用

C++内存管理的方式

C语言开辟空间的函数在C++中依然可以适用,但C++也有自己分配空间的函数:new与delete

语法规则:
需要开辟一个int大小的空间
int* p = new int;
如需要开辟存十个int类型的数组:
int* p1 = new int[10];
销毁空间
delete p;
delete[] p1;

我们发现相比于C语言开辟空间变得更加简洁了,那他的好处只有这一个吗?
不,除了变得更简洁之外,new还有诸多好处
1.new还能很好地控制初始化。如

int* p2 =new int(10);//表示new一个int控件将该控件初始化为10
int* p3 =new int[10]{1,2,3,4,5};//表示new十个int空间并将前五个初始化为大括号内的值

在这里插入图片描述
既然new能控制初始化,自定义类型该怎么处理呢?
2.new对于自定义类型会开空间后调用其构造函数
例如:创建链表节点:
C语言实现如下:
在这里插入图片描述
C++实现如下:在这里插入图片描述
以上的对比大家是不是对new有了新的认知,它确实是十分的方便,因为它与类和对象的特点进行了有机的结合,以后我们开辟空间首选肯定就为new了,与此同时delete也会调用相应的析构函数
3.new开辟失败后,不需要我们像malloc那样手动检查,它能够直接抛异常

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

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

相关文章

了解JSON的作用及其方法

什么是json JSON(JavaScript Object Notation)是一种轻量级的数据交换格式采用完全独立编程语言的文本格式存储和表示数据(就是字符串)。它基于JavaScript语法,但可以被多种编程语言使用和解析。JSON以键值对的形式存…

05 类和对象 3

目录 再谈构造函数static成员友元内部类匿名对象拷贝对象时一些编译器优化再次理解封装 1. 再谈构造函数 1.1 构造函数赋值 在创建对象时,编译器调用构造函数,给对象中各个成员变量一个合适的初始值 class Date { public: Date(int year, int month,…

前端基础自学整理|DOM树

DOM,文档对象模型(Document Object Model),简单的说,DOM是一种理念,一种思想,一个与系统平台和编程语言无关的接口,一种方法, 使 Web开发人员可以访问HTML元素!不是具体方…

MySQL语句大全

MySQL语句大全 数据库操作数据表操作往表中插入数据修改表中数据删除表中数据查询表中数据用户管理函数约束 (限制表中的字段值)多表查询事务 数据库操作 -- 显示数据库 show databases;-- 创建一个数据库 demo create database demo;-- 若不存在数据库 demo 则创建一个数据库…

软件测试基础篇(完整版)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 “尽早的介入测试,遇到问题的解决成本就越低” 随着软件测试技术的发展&#xff0c…

Flutter NestedScrollView 内嵌视图滚动行为一致

Flutter NestedScrollView 内嵌视图滚动行为一致 视频 https://youtu.be/_h7CkzXY3aM https://www.bilibili.com/video/BV1Gh4y1571p/ 前言 上一节讲了 CustomScrollView ,可以发现有的地方滚动并不是很连贯。 这时候就需要 NestedScrollView 来处理了。 今天会写…

Promise中的链式流

如果阅读有疑问的话,欢迎评论或私信!! 本人会很热心的阐述自己的想法!谢谢!!! 携手共进! 文章目录 前言深入Promise链式流 前言 在探索Promise链式流之前我们要知道两个Promise固有…

js设计模式:依赖注入模式

作用: 在对象外部完成两个对象的注入绑定等操作 这样可以将代码解耦,方便维护和扩展 vue中使用use注册其他插件就是在外部创建依赖关系的 示例: class App{constructor(appName,appFun){this.appName appNamethis.appFun appFun}}class Phone{constructor(app) {this.nam…

【鸿蒙 HarmonyOS 4.0】网络请求

一、介绍 资料来自官网:文档中心 网络管理模块主要提供以下功能: HTTP数据请求:通过HTTP发起一个数据请求。WebSocket连接:使用WebSocket建立服务器与客户端的双向连接。Socket连接:通过Socket进行数据传输。 日常…

车载测试,检测项目标准

检测项目: 二.GB/T 31486-2015电动汽车用动力蓄电池电性能要求及试验方法 说明:本标准规定了电动汽车用动力蓄电池(以下简称蓄电池)的 电性能要求、试验方法、检验规则。本标准适用于装载在电动汽车 上的锂离子蓄电池和金属氢化 物镍蓄电池单体和模块&a…

设计模式-创建型模式-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。 由于工厂方法模式中的每个工厂只生产一类产品&…

JS基础之JSON对象

JS基础之JSON对象 目录 JS基础之JSON对象对象转JSON字符串JSON转JS对象 对象转JSON字符串 JSON.stringify(value,replacer,space) value:要转换的JS对象 replacer:(可选)用于过滤和转换结果的函数或数组 space:(可选)指定缩进量 // 创建JS对象 let date {name:"张三…

如何利用内网穿透工具在企业微信开发者中心实现本地接口服务回调

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段,应用服务通常是部署在开发环境,在有数据回调的开发场…

时序数据库TimescaleDB,实战部署全攻略

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

2024华北医院信息网络大会第二轮更新通知

大会背景 近年来,我国医疗行业信息化取得了飞跃式的发展,医疗信息化对医疗行业有着重要的支撑作用。2021年国家卫健委、中医药管理局联合印发《公立医院高质量发展促进行动(2021-2025年)》,提出重点建设“三位一体”智…

Linux定时任务调度

Linux定时任务调度 crond 任务调度 crontab 进行定时任务的设置 介绍 任务调度:是指系统在某个时间执行的特定的命令或程序。 任务调度分类:系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等 个别用户工作:个别用户可能…

SpringBoot指定外部环境配置

nohup java -Xms256m -Xmx512m -Dfile.encodingUTF-8 -jar /usr/local/xxxx.jar --spring.profiles.activeprod > system.log 2>&1 & --spring.profiles.activeprod修改的是多环境配置中内部application.properties里的spring.profiles.active值 -Dspring.config…

SOC电源管理系统简介

1. 概况 随着SOC越来越复杂,包含的IP越来越多,单个SOC上实现了CPU, 射频模块,相机模块,DDR控制模块,外设等等功能。多种功能,多种IP也带来了多档电源的需求。同时为了满足低功耗的挑战,SOC通常被…

代码随想录算法训练营第二十五天|Leetcode216 组合总和III、Leetcode17 电话号码的字母组合

代码随想录算法训练营第二十五天|Leetcode216 组合总和III、Leetcode17 电话号码的字母组合 ● Leetcode216.组合总和III● 解题思路● 代码实现 ● Leetcode17 电话号码的字母组合● 解题思路● 代码实现 ● Leetcode216.组合总和III 题目链接:Leetcode216.组合总和…

计算机网络-局域网和城域网(二)

1.局域网互联设备: 2层网桥(生成树、源路由)、3层交换机、路由器。网桥要求3层以上协议相同,1、2层协议不同可互联。 2.生成树网桥: 又叫透明网桥,IEEE802.1d,生成树算法。基本思想是在网桥之…