[C++深入] --- malloc/free和new/delete

1 new运算符的拓展

1.1 自由存储区与堆的概念

在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区。

自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。

那么自由存储区是否能等于堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

1.2 new定位运算符概念和简单使用方法

new定位运算符的概念:
通常,new负责在堆(heap)中找到一个能够满足要求的内存块。new运算符还有一种变体,被称为定位(placement)new运算符,他能让你能够指定要使用的位置。程序员可以使用这种特性来设置其内存管理规程、处理需要通过特定地址进行访问的硬件或在特定位置创建对象。

new定位运算符的使用场景:

  • 内存池管理:在内存池中预先分配一大块内存,然后在其中构造对象。
  • 自定义内存分配策略:在特定的内存区域(如共享内存、内存映射文件等)中构造对象。
  • 性能优化:通过减少内存分配和释放的开销来优化性能。

new定位运算符语法:

ptr = (Type*)new (ptr) TypeName;
其中 ptr 是一个指向已分配内存的指针,TypeName 是要构造的对象类型。

下面给出实例代码,定位new作用于简单类型的使用方法


#include <iostream>

using namespace std;

void assign_value(int *p, int num, int test)
{
	for (int i = 0; i < num; i++)
	{
		p[i] = i + test;
	}
}

void print_value(int *p, int num)
{
	for (int i = 0; i < num; i++)
	{
		std::cout << p[i] << " ";
	}
    std::cout << std::endl;

}

int main()
{
	char buffer[40];				//缓冲区
	cout << "buffer[40] address=" << (void*)buffer << endl;

	int* p1 = new int[10];			//常规new运算符
    std::cout << "p1 address" << p1 << std::endl;
    assign_value(p1, 10, 0);
    print_value(p1, 10);

	int* p2;
	p2 = new(buffer) int[10];		//定位new运算符
	cout << "p2 address=" << p2 << endl;
    assign_value(p2, 10, 50);
    print_value(p2, 10);

	int* p3;
	p3 = new(buffer) int[10];		//定位new运算符
	cout << "p3 address=" << p3 << endl;
    assign_value(p3, 10, 100);
    print_value(p3, 10);
    print_value(p2, 10);

	int* p4;
	p4 = new(buffer + 2 * sizeof(int))int;
	cout << "p4 address=" << p4 << endl;//偏移2个int字节的新地址
  	print_value(p4, 8);

  delete p1;
  delete p2;
  delete p3;
  delete p4;
	return 0;
}

执行结果如下:
在这里插入图片描述

1.3 定位new作用于复杂数据类型

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

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

相关文章

十大排序算法之->基数排序

一、计数排序简介 基数排序&#xff08;Radix Sort&#xff09;是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。具体做法是用0-9之间的所有整数作为键值&#xff0c;对数据集中的每一个数&#xff0c;按照从…

无线领夹麦克风哪个品牌音质最好,揭秘无线麦克风哪个牌子最好!

​在这个数字化、信息化的时代&#xff0c;短视频和直播已经成为了人们生活中不可或缺的一部分。而无线麦克风&#xff0c;则是这些活动中不可或缺的重要工具。它们能够轻松捕捉声音&#xff0c;让内容更加生动、真实。然而&#xff0c;市场上的无线麦克风种类繁多&#xff0c;…

深入解析与解决高并发下的线程池死锁问题

问题背景 在现代互联网应用中&#xff0c;高并发场景是常态&#xff0c;为了高效处理大量用户请求&#xff0c;后端服务通常会采用线程池来管理线程资源。然而&#xff0c;在一个复杂的微服务架构项目中&#xff0c;我们遇到了一个棘手的问题&#xff1a;在业务高峰期&#xf…

收银系统源码-千呼新零售2.0【线上营销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看&a…

数据结构-顺序表的插入排序

顺序表的排序可以看作数组排序的拓展。基本逻辑和数组排序的逻辑大同小异。 由于顺序表中可以存放不同种的数据类型&#xff0c;进而和结构体排序又有相似之处。其中要注意的是&#xff08;->&#xff09;和&#xff08;.&#xff09;的区别。 -> 符号是针对指针进行的操…

《计算机英语》Unit 1 Computer Overview 计算机概述

期末试卷组成 1、选择20道 2、判断20道 3、词汇翻译&#xff08;单词词组&#xff0c;参照课后习题&#xff09; 4、翻译2道&#xff08;一道原题&#xff0c;参照作业&#xff09; SectionA About Computer 关于计算机 algorithm n. 算法 operate v.…

6.19长难句打卡

The Flatiron School, where people pay to learn programming, started as one of the many coding bootcamps that’s become popular for adults looking for a career change. 人们在Flatiron学校里花钱学习编程&#xff0c;且Flatiron学校也成为在寻求职业变化的成年人之中…

超越招聘技术人才目标的最佳技术招聘统计数据

研究发现&#xff0c;难以找到的人才比以往任何时候都更难找到&#xff1a;根据新人才委员会招聘调查报告&#xff1a;2024年难以找到的人才的战略和战略&#xff0c;60%的受访者表示&#xff0c;熟练人才的招聘时间比一年前长。调查进一步揭示了以下关于招聘技术的关键事实&am…

与亚马逊云科技深度合作,再获WAPP、ISV认证

上半年&#xff0c;VERYCLOUD睿鸿股份加入亚马逊云科技的WAPP&#xff08;Well-Architected Partner Programs&#xff09;和ISV加速计划&#xff08;ISV Accelerate Program&#xff09;&#xff0c;为客户带来更坚实优质的海外云服务。 Well-Architected 获得WAPP这项认证代表…

揭秘,如何轻松选出那瓶专属于你的心动红酒?

红酒&#xff0c;这个充满神秘与浪漫的液体&#xff0c;总能在不经意间触动我们的味蕾&#xff0c;引发无尽的遐想。然而&#xff0c;面对琳琅满目的红酒选择&#xff0c;如何挑选一瓶适合自己的红酒呢&#xff1f;今天&#xff0c;就让我们一起探讨这个话题&#xff0c;并特别…

艾斯迪克MPU60压力控制单元维修

一、艾斯迪克压力控制单元故障识别与诊断 首先&#xff0c;当出现ESTIC压力控制单元MPU60故障时&#xff0c;我们需要进行故障识别与诊断。这通常包括检查设备的显示屏、指示灯以及传感器等部分&#xff0c;以确定故障的具体位置。此外&#xff0c;还可以使用专业的故障诊断工具…

Conda创建与激活虚拟环境(指定虚拟环境创建位置)

1.Conda优势 Conda是一个开源的软件包管理系统和环境管理系统&#xff0c;主要用于在不同的计算环境中安装和管理软件包和其依赖项。它最初是为Python而设计的&#xff0c;但现在也可以用于管理其他语言的软件包。 Conda提供了对虚拟环境的支持&#xff0c;这使得用户可以在同…

解锁分布式云多集群统一监控的云上最佳实践

作者&#xff1a;在峰 引言 在当今数字化转型加速的时代&#xff0c;随着混合云、多云多集群环境等技术被众多企业广泛应用&#xff0c;分布式云架构已成为众多企业和组织推动业务创新、实现弹性扩展的首选&#xff0c;分布式云容器平台 ACK One&#xff08;Distributed Clou…

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请…

llama系列模型学习

一、目录 llama1 模型与transformer decoder的区别llama2 模型架构llama2 相比llama1 不同之处llama3 相比llama2 不同之处llama、llama2、llama3 分词器词表大小以及优缺点采用的损失函数是什么&#xff1f;为什么Layer Norm 改为RMS Norm?如何消除模型幻觉&#xff1f; 二…

Mac电脑FTP客户端推荐:Transmit 5 for Mac 中文版

Transmit 5是一款专为macOS平台设计的功能强大的FTP&#xff08;文件传输协议&#xff09;客户端软件。Transmit 5凭借其强大的功能、直观易用的界面和高效的性能&#xff0c;成为需要频繁进行文件传输和管理的个人用户和专业用户的理想选择。无论是对于新手还是经验丰富的用户…

KT6368A芯片使用后出现扫描不到蓝牙,2脚持续高电平串口没有反应

KT6368A蓝牙芯片连接问题 问题描述&#xff1a; 蓝牙芯片使用一段时间后&#xff0c;出现扫描不到蓝牙&#xff08;部分芯片出现&#xff0c;出现概率挺高&#xff09;&#xff0c;更换新的芯片后就可以扫描到蓝牙 上电后检测2引脚&#xff08;下图BLE_LINK引脚&#xff09;…

使用vant4+vue3制作电商购物网站

一、前言 1.本项目基于vant4vue3构建&#xff0c;默认友友们已具备相关知识&#xff0c;如不具备&#xff0c;请友友们先去了解相关该概念 2.项目数据来源于开源框架 新峰商城 在此指出 3.此项目目的在于帮助友友们了解基本的用法&#xff0c;没有涉及太多的逻辑操作。 二、…

宝塔面板一键迁移项目站点教程

此插件仅用于将当前机器数据迁移出去&#xff0c;数据接收机器无需安装此插件。 注意事项&#xff1a; 当前教程仅适用《宝塔一键迁移API版本》插件&#xff0c;版本号 >3.0。 推荐迁移面板版本 > 6.9.5&#xff0c;低版本迁移可能存在部分数据无法迁移成功。 面板版…

Future You:对话未来的自己

是由麻省理工开发的 AI 聊天机器人&#xff0c;通过填写一系列表单和上传自己的照片&#xff0c;即可看到老年后的自己并与之对话。