内存管理【C++】

news2024/11/13 4:20:11

C/C++内存分布

在这里插入图片描述

  1. 栈又叫堆栈,主要存放非静态局部变量、函数参数、函数返回值,栈一般是向下增长的
  2. 堆用于程序运行时动态内存分配
  3. 数据段用于存储全局数据和静态数据
  4. 代码段用于存储可执行代码和制度常量

C++内存管理方式

C语言的内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且用起来很麻烦

因此C++通过newdelete****操作符进行动态内存管理

内置类型

int main()
{
	// 动态申请一个int类型的空间
	int* ptr1 = new int;

	// 动态申请一个int类型的空间并初始化为10
	int* ptr2 = new int(10);

	// 动态申请十个int类型的空间
	int* ptr3 = new int[10];

	delete ptr1;
	delete ptr2;
	delete[] ptr3;

	return 0;
}

注意:申请和释放单个元素的空间,使用newdelete操作符,申请和释放连续的空间,使用new[]delete[]。如果使用new[]申请空间,使用delete可能会造成内存泄漏

自定义类型

class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		cout << "A():" << endl;
	}

	~A()
	{
		cout << "~A()" << endl;
	}

private:
	int _a;
};

int main()
{
	A* p1 = (A*)malloc(sizeof(A));
	A* p2 = new A(1);
	free(p1);
	delete p2;

	return 0;
}

在这里插入图片描述

调用上述程序可以得到,在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而mallocfree不会

malloc/free和new/delete的区别

  1. mallocfree是函数,newdelete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可
  4. malloc的返回值是void*,使用时必须强转,new不需要
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空new不需要,但是**new必须捕获异常**
  6. 对于自定义类型,mallocfree只会开辟空间,不会调用构造函数和析构函数,而newdelete申请后或销毁前会调用构造和析构函数

总的来说,newfree使用会更加方便

new和delete的实现原理

内置类型

malloc/freenew/delete基本类似

自定义类型

  • new的原理
  1. 调用operator new函数申请空间(底层还是通过malloc申请,相当于封装了一层)
  2. 在申请的空间上调用构造函数
  • delete的原理
  1. 在空间上执行析构函数,完成对象中资源的清理
  2. 调用operator delete函数释放对象的空间(底层是通过free释放空间)

定位new表达式

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象,也就是显示调用构造函数

使用情景:内存池,因为内存池分配的内存没有初始化,如果是自定义类型的对象,需要使用new的定义表达式显示调用构造函数进行初始化

格式:new (place_address) typenew(place_address) type(initializer-list)

place_address必须是一个指针,initializer-list是类型的初始化列表

class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		std::cout << "A()" << this << std::endl;
	}

	~A()
	{
		std::cout << "~A()" << this << std::endl;
	}

private:
	int _a;
};

int main()
{
	A* pa = (A*)malloc(sizeof(A));
	new(pa)A; // 如果A类的构造函数有参数时,此处需传参
	pa->~A();
	free(pa);

	return 0;
}

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

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

相关文章

RabbitMQ 入门篇

接上一篇《RabbitMQ-安装篇&#xff08;阿里云主机&#xff09;-CSDN博客》 安装好RabbitMQ后&#xff0c;我们将开始RabbitMQ的使用&#xff0c;根据官网文档RabbitMQ Tutorials | RabbitMQ&#xff0c;我们一步一步的学习。 1. "Hello World!" 这里先说明几个概…

电影票竞价系统:开发难度与代码规范全解析

电影票竞价系统成为了一种新兴的购票方式&#xff0c;它不仅提升了用户的购票体验&#xff0c;也为电影院带来了新的盈利模式。但是&#xff0c;这样一个系统的开发难度如何&#xff1f;代码又该如何规范&#xff1f;本文将一探究竟。 电影票竞价系统的开发难度 技术复杂性 …

【Android Studio】项目目录结构

文章目录 常用视图Android视图project视图 gradlebuild.gradleSDK 路径主题 常用视图 Android视图 project视图 gradle build.gradle SDK 路径 主题

怎么在电脑中创建虚拟的加密磁盘?

在电脑中创建虚拟的加密磁盘可以有效保护电脑数据&#xff0c;避免电脑数据泄露。那么&#xff0c;我们该怎么在电脑中创建虚拟的加密磁盘呢&#xff1f;下面我们就一起来了解一下吧。 BitLocker 在使用BitLocker加密虚拟磁盘前&#xff0c;我们需要使用虚拟磁盘工具创建一个虚…

Navicat最新版安装及免费使用教程(全网最靠谱,最简单~)

一、官网下载Navicat&#xff1a; Navicat | 下载 Navicat Premium 14 天免费 Windows、macOS 和 Linux 的试用版 二、百度网盘下载 链接: https://pan.baidu.com/s/1J-2ukx3NDTqvNoQsxnE1Jw 提取码: 5120 解压Navicat16和17补丁工具&#xff0c;然后双击执行压缩包文件中的&a…

分布式训练:大规模AI模型的实践与挑战

简介&#xff1a; 随着人工智能的发展&#xff0c;深度学习模型变得越来越复杂&#xff0c;数据集也越来越大。为了应对这种规模的增长&#xff0c;分布式训练成为了训练大规模AI模型的关键技术。本文将介绍分布式训练的基本概念、常用框架&#xff08;如TensorFlow和PyTorch&a…

企业源代码加密软件推荐,10款超好用的源代码加密软件排行榜

在现代软件开发中&#xff0c;源代码是企业的核心资产之一。保护源代码免受未经授权的访问和盗窃至关重要。源代码加密软件可以为企业提供额外的安全层&#xff0c;确保知识产权和商业秘密得到妥善保护。 1. 安秉源码加密软件 通过驱动层透明加密&#xff0c;确保开发人员在使…

ollama修改模型问答的上下文长度(num_ctx)

文章目录 一劳永逸版&#xff1a;修改模型参数临时抱佛脚之命令行生效临时抱佛脚之API生效没啥卵用之OpenAI API传参没啥卵用之OpenAI 问答传参 在使用ollama做大模型问答的过程中&#xff0c;发现存在着当输入问题过长之后&#xff0c;模型无法回答的问题。经过查询资料&#…

做一个图片马(图片木马)的四种方法 小白也能看会(详细步骤 ) 需要.htaccess等执行图片内代码

简介 图片马:就是在图片中隐藏一句话木马。利用.htaccess等解析图片为PHP或者asp文件。达到执行图片内代码目的 4种制作方法: 文本方式打开,末尾粘贴一句话木马 cmd中 copy 1.jpg/b2.php 3.jpg 16进制打开图片在末尾添加一句话木马。 ps 注意以下几点: 单纯的图片马并不…

TCP/IP_TCP协议

目录 一、TCP协议 1.1 确认应答 1.2 超时重传 1.3 连接管理 1.4 TCP状态 1.5 滑动窗口 1.6 流量控制 1.7 拥塞控制 1.8 延迟应答 1.9 捎带应答 1.10 粘包问题 1.11 异常情况 二、TCP/UDP对比 总结 一、TCP协议 TCP 协议和 UDP 协议是处于传输层的协议。 【TCP协…

WEB服务器的详解与部署

WEB服务器也称为网页服务器或HTTP服务器 WEB服务器使用的协议是HTTP或HTTPS HTTP协议默认端口号&#xff1a;TCP 80 HTTPS协议默认端口号&#xff1a;TCP 443 浏览器其实就是 HTTP 客户端 WEB服务器发布软件 微软&#xff1a;IIS(可以发布web网站和FTP站点)linux&#x…

Java:多线程(进程线程、线程状态、创建线程、线程操作)

1&#xff0c;线程概述 1.1&#xff0c;进程和线程 并发是指系统能够同时处理多个任务或操作&#xff0c;通常通过在单个处理器或多个处理器之间快速切换上下文来实现。这些任务可能不是同时进行的&#xff0c;但是它们在时间上重叠。 并行是指系统同时执行多个任务或操作&…

tkinter绘制组件(42)——工具栏按钮组件

tkinter绘制组件&#xff08;42&#xff09;——工具栏按钮组件 引言布局函数结构背景板创建按钮移动背景板完整代码函数 效果测试代码最终效果 github项目pip下载结语 引言 在TinUI中&#xff0c;并不存在工具栏这个概念&#xff0c;但是可以通过使用BasicTinUI控件&#xff…

第二证券:港股交易规则有哪些?

港股的生意规矩&#xff1a; 1、港股生意时间&#xff1a;港股商场的生意时间分为上午和下午两个时段&#xff0c;上午的生意时间通常是9:30至12:00&#xff0c;而下午的生意时间则是13:00至16:00。需求留心的是&#xff0c;港股在周末及法定节假日会休市&#xff0c;此外恶劣…

ECC加密算法:一种高效且安全的加密技术

ECC&#xff08;Elliptic Curve Cryptography&#xff09;&#xff0c;即椭圆曲线密码算法&#xff0c;是一种基于椭圆曲线数学理论的公钥加密算法。自1985年由Neal Koblitz和Victor S. Miller分别独立提出以来&#xff0c;ECC凭借其独特的数学原理和高效的性能&#xff0c;逐渐…

【数据结构】大根堆和小根堆

大根堆实现逻辑 从整棵树的最后一颗子树开始调整&#xff0c;每次都让根节点和左右孩子去比较&#xff0c;如果根节点比左右孩子的最大值要小&#xff0c;那么就将这两个值进行交换&#xff0c;然后此时这颗子树变成了大根堆&#xff0c;再看下一颗树 然后对下一颗树进行相同…

【大模型框架】【基本结构】transformer

论文地址:https://arxiv.org/pdf/1706.03762 1. 整体结构 2. 内部结构 3. 公式 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。

域名过期了网站还能访问吗?怎么查询域名过期?

在当今数字化的时代&#xff0c;网站已经成为企业、个人展示形象和提供服务的重要窗口。而域名作为网站的标识&#xff0c;其重要性不言而喻。然而&#xff0c;域名是有一定有效期的&#xff0c;那么当域名过期了&#xff0c;网站还能访问吗&#xff1f;又该如何查询域名的过期…

Mysql的事务隔离级别实现原理

一、事务隔离级别 mysql支持四种事务隔离级别&#xff1a; 读未提交&#xff1a;一个事务可以读取到另一个事务还未提交的数据&#xff1b;读已提交&#xff1a;一个事务可以读取到另一个事务已经提交的数据&#xff1b;可重复读&#xff1a;同一个事务中&#xff0c;无论读取…