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()
{
	//new

	int* 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);

}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV基础应用(3)— 把.png图像保存为.jpg图像

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教你如何把.png图像保存为.jpg图像&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 如果在电脑某…

【以图会意】文件系统从外存到内存到用户空间

首先&#xff0c;在文件目录中&#xff0c;装有很多块FCB&#xff0c;由文件名和i指针两部分构成&#xff0c;指针指向文件所在的索引结点&#xff0c;包含了例如&#xff1a;文件存储权限&#xff0c;文件长度等一系列文件的信息&#xff0c;最重要的当然是物理地址&#xff0…

Python中带图例的条形图的具体画法和参数调节

首先如上图所示的图是如何画出来的呢&#xff0c;它主要是分三个部分&#xff0c; 首先第一部分是将四个单独的图按照横轴的方式叠加起来&#xff0c;第二部分是如何调节右上角图例的位置和大小&#xff0c;第三部分是标注出整个横轴和竖轴的坐标并调节字体的大小。 一.将四个…

QQ邮箱地址一键自动粘贴,工作效率迅速提升

您是否曾经为了输入邮箱地址而烦恼&#xff1f;每次需要输入邮箱地址时&#xff0c;总是要反复复制粘贴&#xff0c;不仅浪费时间&#xff0c;还容易出错。现在&#xff0c;我们为您带来了一项全新的QQ邮箱自动粘贴功能&#xff0c;让您的工作更加高效便捷&#xff01; 首先&a…

《变形监测与数据处理》笔记/期末复习资料(择期补充更新)

变形&#xff1a; 变形是物体在外来因素作用下产生的形状、大小及位置的变化&#xff08;随时间域和空间域的变化&#xff09;&#xff0c;它是自然界普遍存在的现象。 变形体&#xff1a; 一般包括工程建筑物、构筑物、大型机械设备以及其他自然和人工对象等。 变形体和变形…

华为鸿蒙开发记录

错误 1No module found. Make sure the project sync is completed successfully and the module is set in Edit Configuration > General 应该是项目建立的是Api是9 &#xff0c;但是 华为远程模拟器是应该建立的是 8的&#xff0c;导致 版本过低。从新建立项目选择APi8就…

QtiPlot for Mac v1.1.3(科学数据分析工具)

QtiPlot是一款跨平台科学绘图软件&#xff0c;它可以在Windows、Linux和Mac OS X等多个平台上运行。QtiPlot具有强大的数据分析和可视化功能&#xff0c;被广泛应用于学术界和工业界的数据处理和图形制作。 QtiPlot支持多种语言&#xff0c;包括但不限于英语、中文等&#xff…

JS-项目实战-批量删除水果库存记录

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name);}} }//当页面加载完成后执行后面的…

人人商城app禁用

api.map.baidu.com 换成 lbs.map.baidu.com

SQL存储过程和函数

SQL存储过程和函数 变量系统变量用户定义变量局部变量 存储过程存储函数 变量 在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。 系统变量 系统变量 是MySQL服务器提供&#xff0c;不是用户定义的&#xff0c;属于服务器层面。分为全局变量&#xff08;GLOBA…

MCAL实战三(S32K324-NXP EB tresos Port驱动配置详解)

一、前言 PORT驱动初始化就是对微控制器(MCU)的整个PORT模块进行初始化配置。很多端口和管脚被分配有多种不同的功能,即可以进行引脚功能复用,比如通用I/O、模数转换、脉宽调制等功能。因此,对PORT必须有一个整体的配置和初始化,对各管脚的具体配置和使用取决于微控制器和…

【部署篇】宝塔liunx中使用docker部署nestjs项目【全过程】

一、 &#x1f44b; 前序工作 连接服务器 获取宝塔面板信息 在命令行输入sudo /etc/init.d/bt default 进入宝塔面板输入账号密码 通过上面网址进入宝塔 安装自己需要的东西 **PS&#xff1a;**这里还需要自己登录宝塔账号&#xff0c;没有账号的同学需要注册一下 安装pm2…

高性能架构设计

1. 引言 高性能架构设计在现代系统中至关重要&#xff0c;它能够应对大规模的数据和用户需求增长&#xff0c;提供优秀的用户体验和实时数据处理能力。同时&#xff0c;它也是解决"三高"问题&#xff08;高并发、高性能、高可用性&#xff09;的关键。 2. 高性能定…

GZ038 物联网应用开发赛题第10套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第10套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考…

从内网到公网:使用Axure RP和内网穿透技术发布静态web页面的完整指南

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

前端界面网页截图(干货)

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 看了一些谷歌插件&#xff0c;可以对网页进行局部截图或者是整个网页截图&#xff0c;于是想着弄个demo,关于前端的截图。最后选择了 html2canvas 1.下载安装包 Install NPM npm install --save html2canvas或者…

在Linux上安装Oracle 数据库 11g (含静默方式安装)

好久没碰11g了&#xff0c;今天&#xff08;2023年11月16日&#xff09;因为有个需求又装了一遍。 在OCI上安装了一个Oracle Linux 6实例&#xff1a; $ uname -a Linux instance-20231116-1239-db11g 4.1.12-124.80.1.el6uek.x86_64 #2 SMP Mon Oct 9 02:32:10 PDT 2023 x86…

【已解决】启动SSH服务报“could not load host key”错误

文章目录 问题复现解决方案 问题复现 解决方案 yum remove openssh-* && yum install -y openssl openssh-server && systemctl restart sshd

Sqlite安装配置及使用

一、下载SQLite Sqlite官网 我下载的是3370000版本:sqlite-dll-win64-x64-3370000.zip 和 sqlite-tools-win32-x86-3370000.zip 二、解压下载的两个压缩包 三、配置环境 四、检查是否安装配置成功 winR&#xff1a;输入cmd调出命令窗口&#xff0c;输入sqlite3后回车查看s…

0x80070002错误代码要怎么解决?修复0x80070002的方法

0x80070002错误代码&#xff0c;这个系统更新相关的错误&#xff0c;经常在进行系统备份或更新时出现&#xff0c;打乱了我们的步调。为了帮助大家解决问题&#xff0c;本文将探讨该错误0x80070002产生的原因&#xff0c;提供详细的解决步骤&#xff0c;并分享预防措施。 一.0x…