C++系列-定位new表达式(placement-new)

news2024/9/21 14:50:45

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”  

我们先来强调一个很关键的问题,那就是在new和delete中的一一对应的问题,

我们先来看一段代码:

#include<iostream>
using namespace std;
class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a = 0)" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};
int main()
{
	//A* p1 = new A;
	A* p2 = new A[10];
	//cout << sizeof() << endl;
	//delete[] p2;
	delete p2;
	//free(p2);
	//int* p3 = new int[10];
	//free(p3);


	return 0;
}

在这段代码当中,会发生报错情况,你知道是为什么吗? 

这个原因是为什么呢?

用new[]创建多个变量的时候,编译器会在前面自动加上四个字节,用来告诉编译器,一共有多少个变量,但是删除的时候并不会从头进行删除,也就是说并不会删除完全,所以会出现报错情况。

所以,我们最好的选择就是要进行一一对应。

	A* p2 = new A[10];
	//cout << sizeof() << endl;
	delete[] p2;
	A* p1 = new A;
	p1->A();

另外,在编译器当中,不支持这样显示调用构造函数,那么正确的做法应该是下面这样子:

	A* p1 = new A;
	new(p1)A;
	new(p1)A(10);

我们可以通过上面这样的方式对已有的空间,显示调用构造。

或者也可以显示调用operator new和operator new[]这两个全局函数

	A* p2 = (A*)operator new[](sizeof(A) * 10);
	new(p2)A[10]{ 1,2,3,4 };

我们也可以采用另外一种方式进行初始化赋值

	A* p2 = (A*)operator new[](sizeof(A) * 10);
	/*new(p2)A[10]{ 1,2,3,4 };*/
	for (int i = 0; i < 10; i++)
		new(p2 + i)A(i);
	for (int i = 0; i < 10; ++i)
	{
		(p2 + i)->~A();
	}
	operator delete[](p2);

 注意事项:

  • malloc和free是函数,new和delete是操作符
  • malloc申请的空间不会初始化,new可以初始化
  • malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可
  • malloc的返回值是void*,在使用时必须要强转,new不需要,因为new后面跟的是空间的类型
  • malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要补货异常
  • 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。

 

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

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

相关文章

K8s的CRI机制是什么?

1. 概述 进入 K8s 的世界&#xff0c;会发现有很多方便扩展的 Interface&#xff0c;包括 CRI, CSI, CNI 等&#xff0c;将这些接口抽象出来&#xff0c;是为了更好的提供开放、扩展、规范等能力。 K8s CRI(Container Runtime Interface) 是 K8s 定义的一组与容器运行时进行交…

Web3 游戏周报(5.19 - 5.25)

【5.19 - 5.25】Web3 游戏行业动态&#xff1a; Arbitrum 已开启 “2 亿枚 ARB 游戏催化剂计划”的提案投票。 STEPN 在官方 X 宣布将推出全新社交健身应用 STEPN GO。 Oasys 正式推出《足球小将》漫改 Web3 游戏《Captain Tsubasa-RIVALS-》。 Gala Games &#xff1a;已销…

8.Redis之hash类型

1.hash类型的基本介绍 哈希表[之前学过的所有数据结构中,最最重要的] 1.日常开发中,出场频率非常高. 2.面试中,非常重要的考点, Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中…

C++容器之向量(std::vector)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 iterators3.4 capacity3.5 rezize3.6 reserve3.7 shrink_to_fit3.8 access3.9 assign3.10 push_back3.11 pop_back3.12 insert3.13 erase3.14 swap3.15 clear3.16 emplace3.17 emplace_back3.18 get_allocator1 概…

智慧树下做游戏

游戏开发工程师致力于游戏总体设计 &#xff0c;负责游戏开发工具和运营维护工具的设计与开发 &#xff0c;并配合主程序完成游戏架构及各大功能的设计、开发、调试和其他技术支持 就业方向&#xff1a; 一般有客户端游戏开发和服务器游戏开发 客户端开发&#xff1a; 主要负…

【漏洞复现】Gradio component_server 任意文件读取漏洞(CVE-2024-1561)

0x01 产品简介 Gradi0是一个开源的 Python库&#xff0c;用于创建机器学习模型的交互式界面。它使得展示和测试模型变得简单快捷&#xff0c;无需深入了解复杂的前端技术。广泛应用于数据科学、教育、研究和软件开发领域&#xff0c;尤其适合于快速原型设计、模型验证、演示和…

在没有足够测试数据的请情况下,如何验证前端页面的分页展示和渲染情况

问题描述&#xff1a;测试过程中&#xff0c;为了验证前端页面的展示效果及分页组件的展示情况&#xff0c;测试人员一般都会选择在数据库造数据&#xff0c;但遇到表格管理逻辑特别复杂的情况&#xff0c;可能会耗费大量的时间&#xff0c;此时我们可以选择使用工具模拟返回值…

关于kube-prometheus拉取镜像的问题

由于国内网络环境的问题想通过kube-prometheus配置监控但是拉取镜像会报错 包已经打好下载好镜像就可以使用&#xff1a; https://download.csdn.net/download/m0_59744084/89349768 kubectl get pod -n monitoring 问题&#xff1a;"Failed to pull image "regist…

IC解析之SN74HCS595QPWRQ1

目录 1.主要参数2. 接口定义3. 工作原理分析移位寄存器器的作用SN74HCS595QPWRQ1工作原理 4.总结 1.主要参数 2. 接口定义 其中QH‘为串行输出接口&#xff0c;QA~QH为并行输出接口&#xff0c;SER为串行输入接口&#xff0c;其他未移位以及储存控制引脚 3. 工作原理分析 移位…

26计算机操作系统408考研--操作系统设备管理篇章(五)

文章目录 一、设备是什么&#xff1f;设备管理目标和任务I/O设备分类 二、I/O系统控制方式程序直接控制方式中断控制方式DMA控制方式通道控制方式 I/O软件的组成I/O软件设计目标和原则I/O软件结构设备驱动程序设备无关软件用户层软件用户层的I/O软件 具有通道的设备管理通 道通…

R绘图学习笔记

1、R语言绘制海岸线边界 参考&#xff1a; Drawing beautiful maps programmatically with R, sf and ggplot2 — Part 1: Basics 使用R绘制世界地图及纬度统计图 Drawing maps with R. A basic tutorial&#xff1a;https://dr2blog.hcommons.org/2020/03/23/drawing-maps-wit…

第 52 期:MySQL 半同步复制频繁报错

社区王牌专栏《一问一实验&#xff1a;AI 版》全新改版归来&#xff0c;得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询&#xff0c;表达了想试用体验 ChatDBA 的意愿&#xff0c;对此我们表示感谢 &#x1f91f;。 目前&#xff0c;ChatDBA 还在最后的准备…

keepalived交叉编译

前言 Keepalived可以实现对服务器的健康检查&#xff0c;当主服务器出现故障时&#xff0c;自动将服务切换到备份服务器上&#xff0c;确保服务的连续性&#xff0c;避免单点故障。它还可以管理一个虚拟 IP 地址&#xff0c;在主备服务器之间进行灵活切换&#xff0c;对外提供…

Linux如何在目录下灵活创建、浏览、删除百万个文件

文章目录 一、创建百万级小文件1、单核CPU情况2、多核CPU情况3、执行效率对比3.1、单核的顺序执行3.2、多核的并发执行 二、如何列出/浏览这些文件1、查看目录下文件的数量2、列出&#xff1f;3、ls -f&#xff08;关闭排序功能&#xff09;3.1、执行效率对比 4、通过重定向导入…

2024深圳数字能源展推介会在巴西圣保罗举行

4月26日&#xff0c;深圳市发展和改革委员会在巴西圣保罗国际工程机械及矿山机械展上举行专题推介会&#xff0c;介绍将于今年下半年在深圳市举办的2024国际数字能源展。 深圳市发展和改革委员会主任郭子平在推介会上介绍&#xff0c;为进一步深化数字能源领域互利共赢&#xf…

“二叉堆:不是,啊?”

目录 前言一、堆的概念及结构堆的性质&#xff1a;堆的结构:最大堆最小堆堆顶注意 二、堆的实现1.初始化堆2. 堆的插入什么是堆的向上调整算法&#xff1f; 3.堆的删除什么是堆的向下调整算法&#xff1f; 4.获取堆顶的数据5.获取堆的数据个数6.堆的判空7.堆的销毁 三、建堆的时…

逻辑分析仪的调试使用

调试软件下载&#xff1a;点击跳转 一、接线 逻辑分析仪 设备 GND --- GND CHX&#xff08;数据通道&#xff09; --- 通信引脚 二、数据采集 图中两个可以选择数字大小的地方分别表示 采样深度 &#xff08;10M Samples&a…

eBay运营账号防关联成功的关键因素是什么?

一、什么是eBay&#xff1f; eBay如今的发展现状呈现出积极且充满活力的态势。作为全球知名的在线拍卖和购物平台&#xff0c;随着全球消费者对线上购物的需求不断增长&#xff0c;这为卖家提供了广阔的市场空间和盈利机会&#xff0c;但多账号的运营若处理不好容易引起账号被关…

宝塔下新增站点 No Input File Specified.错误修复

今天明月收到了一个购买【站长必备在线工具源码含上百款工具-博客优化修复版】用户的求助&#xff0c;在宝塔里新增网站部署好工具源码后&#xff0c;访问出现“No input file specified.”的提示。其实出现这个提示一般都是 PHP 文件无法被解析造成的。 简单排查了一下宝塔相关…

521源码-免费下载-WordPress全能自动采集与发布插件 – WP-AutoPostPro 汉化版

更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源 本工具下载地址&#xff1a;WordPress全能自动采集与发布插件 – WP-AutoPostPro 汉化版 - 521源码 WP-AutoPostPro是一款出类拔萃的WordPress自动采集发布插件&#xff0c;凭借其卓…