lesson05:C++内存管理

news2024/11/27 12:56:30

1.内存分布

2.c++中动态内存管理

3.operator new和operator delete函数

4.new和delete实现原理

1.内存分布

1.1常见的内存分布

1.2相关问题

答案:CCCAA        AAADAB

我们讲以下易错的部分:

7.数组char2是在上开的空间,然后将"abcd"拷贝给该数组,所以char2指向的内容在上。

9.之前说过,字符串是只读数组,"abcd"是数组名,是首元素的地址,这里实际上是将字符串第一个元素的地址赋给pChar3,所以pChar3指向的内容在代码段

补充:

猜猜看,变量a在哪?

其实,它在上,其实const只有限制访问的作用

2.c++中动态内存管理

c++可以通过new和delete操作符进行动态内存管理

new类似于mallocdelete类似于free

2.1new和delete操作内置类型

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{
	int* pa = new int;//申请一个元素的空间
	int* pb = new int(10);//单元素初始化
	int* pc = new int[10];//申请10个元素的空间
	int* pd = new int[10] {1, 2, 3};//多元素初始化
	delete pa;//单元素释放空间
	delete pb;
	delete[] pc;//多元素释放空间
	delete[] pd;
	return 0;
}

注意:申请空间时不完全初始化,编译器会将其他元素初始化为0

注意:如果不手动初始化,编译器也不会初始化

2.2new和delete操作自定义类型

2.2.1申请一个元素的空间
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Date
{
public:
	Date()
	{
		cout << "Date()" << endl;
	}
	Date(int a)
	{
		cout << "Date(int a)" << endl;
	}
	Date(int a, int b)
	{
		cout << "Date(int a, int b)" << endl;
	}
};
using namespace std;
int main()
{
	Date* p1 = new Date;//不传参
	Date* p2 = new Date(Date(1));//匿名对象传单参
	Date* p3 = new Date(1);//隐式类型转换传单参
	Date* p4 = new Date(Date(1, 2));//匿名对象传多参
	Date* p5 = new Date(1, 2);//隐式类型转换传多参
	delete p1;
	delete p2;
	delete p3;
	delete p4;
	delete p5;
	return 0;
}
2.2.2申请多个元素的空间
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Date
{
public:
	Date()
	{
		cout << "Date()" << endl;
	}
	Date(int a)
	{
		cout << "Date(int a)" << endl;
	}
	Date(int a, int b)
	{
		cout << "Date(int a, int b)" << endl;
	}
};
using namespace std;
int main()
{
	Date* p1 = new Date[3];//不传参
	Date* p2 = new Date[3]{ Date(1),Date(2),Date(3) };//匿名对象传单参
	Date* p3 = new Date[3]{ 1,2,3 };//隐式类型转换传单参
	Date* p4 = new Date[3]{ Date(1, 2),(2,3),(3,4) };//匿名对象传多参
	Date* p5 = new Date[3]{ {1,2},{2,3},{3,4} };//隐式类型转换传多参
	delete[] p1;
	delete[] p2;
	delete[] p3;
	delete[] p4;
	delete[] p5;
	return 0;
}

那么参数个数能混传吗?

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Date
{
public:
	Date()
	{
		cout << "Date()" << endl;
	}
	Date(int a)
	{
		cout << "Date(int a)" << endl;
	}
	Date(int a, int b)
	{
		cout << "Date(int a, int b)" << endl;
	}
};
using namespace std;
int main()
{
	Date* p1 = new Date[3]{ 1,{2,3},4 };
	Date* p2 = new Date[3]{ Date(1),Date(2,3),Date() };
	delete[] p1;
	delete[] p2;
	return 0;
}

答案是可以的。

注意:new将自动调用构造函数,delete自动调用析构函数。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Date
{
public:
	Date()
	{
		cout << "Date()" << endl;
	}
	~Date()
	{
		cout << "~Date()" << endl;
	}
};
using namespace std;
int main()
{
	Date* p1 = new Date;
	delete p1;
	return 0;
}

但是,malloc和free不行

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Date
{
public:
	Date()
	{
		cout << "Date()" << endl;
	}
	~Date()
	{
		cout << "~Date()" << endl;
	}
};
using namespace std;
int main()
{
	Date* p1 = (Date*)malloc(sizeof(Date));
	free(p1);
	return 0;
}

3.operator new和operator delete函数

这是两个库函数,不是运算符重载

operator new是对malloc的封装,在operator new中,申请空间失败会抛异常

operator delete是对free的封装,即释放空间。

4.new和delete实现原理

new等价于operator new+构造函数

delete等价于operator delete+析构函数

由于operator new申请空间失败会抛异常,所以用new开空间时,不用检查是否成功。

注意:mallocfree要配套使用,newdelete也要配套使用,它们不能混用

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

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

相关文章

golang学习笔记(net/http库基本使用)

关于net/http库 我们先看看标准库net/http如何处理一个请求。 import ("fmt""log""net/http" )var count 0func main() {http.HandleFunc("/", handler)http.HandleFunc("/count", counter)log.Fatal(http.ListenAndServ…

STM32_舵机的实战

一、配置相应的管脚 二、写代码

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题出来&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题&#xff0c;帖子链接&#xff1a;《刚刚新安装的OceanBase集群&#xff0c;…

leetcode 221 最大正方形面积

示例 3&#xff1a; 输入&#xff1a;matrix [["0"]] 输出&#xff1a;0 # 最大正方形面积 def max_square(matrix):m len(matrix)n len(matrix[0])if m 0 or n 0::return Nonemax_side 1dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):fo…

AI大模型探索之路-训练篇1:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内&#xff0c;大型预训练语言模型&#xff08;Large Language Models, LLMs&#xff09;已经成为推动技术革新的关…

国产麒麟v10系统下打包electron+vue程序,报错unknown output format set

报错如下&#xff1a; 报错第一时间想到可能是代码配置原因报错&#xff0c;查看代码似乎感觉没啥问题 又查看具体报错原因可能是因为icon的原因报错&#xff0c;后面查阅发现ico在各系统平台会不兼容&#xff0c;也就是ico是给win下使用的&#xff0c;此处改下图标格式就ok&am…

【机器学习】近邻类模型:KNN算法在数据科学中的实践与探索

近邻类模型&#xff1a;KNN算法在数据科学中的实践与探索 一、KNN算法的基本原理二、KNN算法的变种与改进三、KNN算法的Python实践四、总结与展望 在数据科学领域&#xff0c;分类和回归是两大核心问题。随着大数据时代的到来&#xff0c;传统参数化模型在某些复杂场景中已难以…

Selenium IDE 常见错误笔记

错误1&#xff1a;Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时&#xff0c;有两个原因&#xff1a; Firefox阻止了弹出式窗口&#xff0c;在浏览器设置里允许这个操作即可。 有些网站设置了反扒机制&#xff0c;脚本运行…

数据结构复习指导之队列

文章目录 队列 考纲内容 复习提示 1.队列的基本概念 1.1队列的定义 1.2队列常见的基本操作 1.3重要考点 2.队列的顺序存储结构 2.1队列的顺序存储 2.2循环队列 2.3循环队列的操作 2.4重要考点 3.队列的链式存储结构 3.1队列的链式存储 3.2链式队列的基本操作 3…

LeetCode in Python 48. Rotate Image/Matrix (旋转图像/矩阵)

旋转图像/矩阵的重点是寻找旋转前后对应位置的坐标关系。 示例&#xff1a; 图1 旋转图像/矩阵的输入输出示意图 代码&#xff1a; class Solution:def rotate(self, matrix):n len(matrix)for i in range(n // 2):for j in range(i, n - 1 - i):topleft matrix[i][j]ma…

线上申报开放时间!2024年阜阳市大数据企业培育认定申报条件、流程和材料

2024年阜阳市大数据企业培育认定申报条件、流程和材料&#xff0c;线上申报开放时间整理如下 一、2024年阜阳市大数据企业培育认定申报要求 &#xff08;一&#xff09;经营范围 申请认定的企业应当从事以下生产经营活动&#xff1a; 1.从事数据收集、存储、使用、加工、传输、…

Scrapy爬虫框架入门(豆瓣电影Top 250)

文章目录 Scrapy 官网Scrapy 文档GithubScrapy 简介项目结构爬虫实现XPath 教程创建 Scrapy 项目配置用户代理网页 dom 元素 IP 代理池IP代理池作用配置IP代理池申请IP代理池 Scrapy 官网 https://scrapy.org/ Scrapy 文档 https://docs.scrapy.org/en/latest/ Github htt…

快速入门Web开发(中)后端开发(有重点)

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 CSDN 图片导入做的不是很好&#xff0c;因此如果有没有…

Oracle 数据迁移同步优化(三)

简述 CloudCanal 最近再次对其 Oracle 源端数据同步进行了一系列优化&#xff0c;这些优化基于用户在真实场景中的反馈&#xff0c;具备很强的生产级别参考意义。 本文将简要介绍这些优化项&#xff0c;希望带给读者一些收获。 增量事件 SCN 乱序问题MISSING_SCN 事件干扰新…

信息系统项目管理师0069:数据运维(5信息系统工程—5.2数据工程—5.2.3数据运维)

点击查看专栏目录 文章目录 5.2.3数据运维1.数据存储2.数据备份3.数据容灾4.数据质量评价与控制记忆要点总结5.2.3数据运维 数据开发利用的前提是通过合适的方式将数据保存到存储介质上,并能保证有效的访问,还要通过数据备份和容灾手段,保证数据的高可用性。数据质量管理是在…

让直播和视频通话更精彩的实时换脸神器: 亲妈都未必认识

DeepFacelive&#xff1a;让直播和视频通话更精彩的实时换脸神器&#xff01; 你是否想在直播或视频通话时&#xff0c;给观众带来惊喜和欢乐&#xff1f;你是否想尝试一下换脸的乐趣&#xff0c;展现出不同的自己&#xff1f;如果你的答案是肯定的&#xff0c;那么你一定不能错…

什么是云手机?云手机有什么用?

过去&#xff0c;我们手中的手机是我们生活、工作、娱乐的得力助手&#xff0c;但随着时代的变迁和技术的发展&#xff0c;我们需要的不仅仅是一部手机&#xff0c;而是一个更强大、更灵活的工具。在这个时候&#xff0c;云手机横空出世&#xff0c;成为了我们手机使用的新选择…

性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法

文章目录 一、前言二、加密接口1、什么是SM22、被测接口加密逻辑 三、准备工作四、JMeter 扩展实现步骤1&#xff1a;准备开发环境步骤2&#xff1a;了解实现方法步骤3&#xff1a;runTest 方法步骤4&#xff1a;getDefaultParameters 方法步骤5&#xff1a;setupTest 方法 五、…

MATLAB 向量

MATLAB 向量 向量是一维数字数组。MATLAB允许创建两种类型的向量 行向量 列向量 行向量 行向量通过将元素集括在方括号中并使用空格或逗号定界元素来创建。 示例 r [7 8 9 10 11] MATLAB将执行上述语句并返回以下结果- r 7 8 9 10 11 列向量 列向量 通过将元素集括在方…

GPU深度学习环境搭建:Win10+CUDA 11.7+Pytorch1.13.1+Anaconda3+python3.10.9

1. 查看显卡驱动及对应cuda版本关系 1.1 显卡驱动和cuda版本信息查看方法 在命令行中输入【nvidia-smi】可以当前显卡驱动版本和cuda版本。 根据显示,显卡驱动版本为:Driver Version: 516.59,CUDA 的版本为:CUDA Version 11.7。 此处我们可以根据下面的表1 显卡驱动和c…