当前位置: 首页 > news >正文

c++内存管理(上)

目录

引入

分析

说明

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

C++内存管理方式

new/delete操作内置类型

new和delete操作自定义类型


引入

我们先来看下面的一段代码和相关问题
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);
}
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 区别?

分析

全局变量与static变量均在静态区(static变量在第一次载入时初始化)

字符串均在常量区,如果是采用数组方式,那么就是从常量区将字符串拷贝到栈区中,因此对字符串数组存储在栈中,而下面的字符串指针指向字符串所存储的位置,字符串本身存储在常量区中

注意:const char* ptr="abcd",*ptr在常量区,因为*ptr无法被修改,因此会直接将常量区的位置传递给指针

各种变量,包括int char 指针类型变量都存储在栈中

sizeof如果是整个数组则返回数组大小,如果是其他类型变量则返回变量大小

strlen返回的是字符串长度从第一个元素到'\0'之前的元素个数

说明

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

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

malloc/calloc/realloc/free
void Test ()
{
int* p1 = (int*) malloc(sizeof(int));
free(p1);
// 1.malloc/calloc/realloc的区别是什么?
int* p2 = (int*)calloc(4, sizeof (int));
int* p3 = (int*)realloc(p2, sizeof(int)*10);
// 这里需要free(p2)吗?
free(p3 );
}

C++内存管理方式

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

new/delete操作内置类型

void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[10];
delete ptr4;
delete ptr5;
delete[] ptr6;
}

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

newdelete操作自定义类型

class A
{
public:
A(int a = 0)
: _a(a)
{
cout << "A():" << this << endl;
}
~A()
{
cout << "~A():" << this << endl;
}
private:
int _a;
};
int main()
{
// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构
造函数和析构函数
A* p1 = (A*)malloc(sizeof(A));
A* p2 = new A(1);
free(p1);
delete p2;
// 内置类型是几乎是一样的
int* p3 = (int*)malloc(sizeof(int)); // C
free(p3);
delete p4;
A* p5 = (A*)malloc(sizeof(A)*10);
A* p6 = new A[10];
free(p5);
delete[] p6;
return 0;
}
注意:在申请自定义类型的空间时, new 会调用构造函数, delete 会调用析构函数,而 malloc free 不会

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 论文辅助笔记:ST-LLM
  • UE5 修改项目名称 类的名称
  • 了解Adam和RMSprop优化算法
  • 基于深度学习的图像补全
  • elementPlus-vue3-ts表格单选和双选实现方式
  • 【C++】C++入门基础--命名空间,缺省参数,函数重载
  • RTOS系统 -- 调试大法之FreeRTOS在M4上实现coredump功能
  • Spark操作Excel最佳实践
  • 66.Python-web框架-Django-免费模板django-datta-able的分页的一种方式
  • Java核心技术【十八】Java集合框架精讲:List、Set、Map
  • disql使用
  • 白底图怎么拍?白底图一键生成!除了前期拍摄,主要少了专业软件
  • 使用requests爬取拉勾网python职位数据
  • go-redis源码解析:连接池原理
  • 请编写函数,判断一字符串是否是回文,若是回文函数返回值为1,否则返回值为0,回文是顺读和倒读都一样的字符串
  • 【译】JS基础算法脚本:字符串结尾
  • ES6指北【2】—— 箭头函数
  • [Vue CLI 3] 配置解析之 css.extract
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Logstash 参考指南(目录)
  • MySQL-事务管理(基础)
  • Spring Cloud中负载均衡器概览
  • spring学习第二天
  • 阿里云前端周刊 - 第 26 期
  • 从PHP迁移至Golang - 基础篇
  • 关于字符编码你应该知道的事情
  • 基于HAProxy的高性能缓存服务器nuster
  • 技术:超级实用的电脑小技巧
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 手写一个CommonJS打包工具(一)
  • 微信小程序填坑清单
  • 详解NodeJs流之一
  • 详解移动APP与web APP的区别
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 最简单的无缝轮播
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​ArcGIS Pro 如何批量删除字段
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​如何防止网络攻击?
  • ​用户画像从0到100的构建思路
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • ###C语言程序设计-----C语言学习(3)#
  • #if等命令的学习
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #知识分享#笔记#学习方法
  • (LeetCode C++)盛最多水的容器
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)可以带来幸福的一本书