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

C++初阶--内存管理

文章目录

  • 内存分布
  • new/delete
    • 基本用法
    • malloc/free和new/delete的区别
    • 进一步理解
    • new和delete的实现原理
  • 定位new(了解)

内存分布

在这里插入图片描述

栈(stack):栈是由编译器自动管理的内存区域,用于存储局部变量,函数参数和函数调用信息等。栈的特点是后进先出,它的生命周期与函数的调用关系密切联系。当函数调用结束后,栈上的局部变量会被自动销毁

堆(heap):堆是由程序员手动管理的动态内存区域,用于存储动态分配的对象。通过使用new/delete等操作符来手动申请和释放堆上的内存。堆上的内存生命周期由程序员来负责控制,需要手动释放以避免内存泄漏。

全局存储区(data):全局存储区用于存储全局变量和静态变量。全局变量在程序运行期间一直存在,静态变量具有生命周期,即从声明到程序结束都存在。全局存储区的内存由编译器在程序开始时进行分配,在程序结束时进行自动释放

常量存储区(cost):常量存储区用于存储常量值,例如字符串常量,数字等。这部分内存通常是只读的,不可修改。

new/delete

在C语言中,我们是用malloc和free来进行动态内存管理的,而在C++中,我们习惯使用new/delete来进行动态内存管理。

基本用法

class A
{
private:int _a;
public:A(int a=0):_a(a){cout << "A()" << endl;}~A(){cout << "~A()" << endl;}
};
int main()
{//newint* p1 = new int;*p1 = 20;int* p2 = new int[10];p2[0] = 1;p2[1] = 2;int* p3 = new int(4);int* p4 = new int[10] {1, 2, 3};delete p1;delete[] p2;delete p3;delete[] p4;//对于自定义类型来说//new的本质:开空间+使用构造函数A aa1;A aa2;A aa3;A* p5 = new A[3]{ aa1,aa2,aa3 };A* p6 = new A[3];A* p7 = new A[3]{ A(1),A(2),A(3) };A* p8 = new A[3]{ 1,2,3 };delete[] p5;delete[] p6;delete[] p7;delete[] p8;return 0;
}

基本用法:

在这里插入图片描述
在这里插入图片描述

有自定义类型时:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

malloc/free和new/delete的区别

在这里插入图片描述

进一步理解

class Stack 
{
private:int* _a;int _top;int _capacity;
public:Stack(int capacity = 4):_a(new int[capacity]),_top(0),_capacity(capacity){cout << "Stack(int capacity):" << endl;}~Stack(){cout << "~Stack()" << endl;delete[] _a;_a = nullptr;_top = 0;_capacity = 0;}
};
int main()
{Stack* p1 = new Stack;delete p1;Stack* p2 = (Stack*)operator new(sizeof(Stack));operator delete(p2);Stack* p3 = new Stack[10];//delete[] p3;delete p3;A* p4 = new A[10];delete p4;return 0;
}

空间的开辟:

在这里插入图片描述

操作数new和delete:

在这里插入图片描述

当把析构函数屏蔽了,使用delete p3,为什么可以通过编译:

在这里插入图片描述
*加粗样式

new和delete的实现原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

定位new(了解)

定位new是一种特殊的用法,用于在指定的内存位置上创建对象。通常情况下,使用new关键字会在堆内存中动态分配一块适当的空间大小,并在该内存上构造一个对象。而定位new则允许我们预先分配一块内存,并在该内存上构造对象

语法形式:new(address)Type(arguments)

int main()
{A* p1 = (A*)operator new(sizeof(A));//不能显示调用构造函数//p1->A(1);//可以这样操作new(p1)A(1);//析构函数可以显示调用p1->~A();operator delete(p1);}

在这里插入图片描述

相关文章:

  • Visual Studio Code配置c/c++环境
  • 大数据技术与原理实验报告(MapReduce 初级编程实践)
  • 验证码:EasyDL 机器学习识别与云码平台一站式识别
  • pyTorch Hub 系列#4:PGAN — GAN 模型
  • 设计模式:模板模式
  • STM32H750之FreeRTOS学习--------(六)FreeRTOS的列表和列表项
  • 视频封装格式
  • 智慧城市项目建设介绍
  • 使用docker/k8s部署项目
  • 4. 【自动驾驶与机器人中的SLAM技术】点云中的拟合问题和K近邻
  • 线程的面试八股
  • 【Qt之QWizard问题】setPixmap()设置logo、background、watermark无效不显示解决方案
  • 基于 Amazon EKS 搭建开源向量数据库 Milvus
  • 当设计模式遇上万象:探秘适配器模式的神奇变身
  • CSAPP第四章:Y86 SEQ(指令顺序执行)的硬件结构
  • ES6指北【2】—— 箭头函数
  • @jsonView过滤属性
  • 0x05 Python数据分析,Anaconda八斩刀
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Effective Java 笔记(一)
  • Iterator 和 for...of 循环
  • Laravel Telescope:优雅的应用调试工具
  • mac修复ab及siege安装
  • Making An Indicator With Pure CSS
  • Otto开发初探——微服务依赖管理新利器
  • 给github项目添加CI badge
  • 精彩代码 vue.js
  • 聊聊directory traversal attack
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 问题之ssh中Host key verification failed的解决
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • #、%和$符号在OGNL表达式中经常出现
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C#)一个最简单的链表类
  • (超详细)语音信号处理之特征提取
  • (分布式缓存)Redis哨兵
  • (转)大型网站的系统架构
  • . Flume面试题
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .netcore 获取appsettings
  • .NET大文件上传知识整理
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net组件程序设计之线程、并发管理(一)
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [20190113]四校联考
  • [20190401]关于semtimedop函数调用.txt
  • [ANT] 项目中应用ANT
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
  • [hdu 2896] 病毒侵袭 [ac自动机][病毒特征码匹配]
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法