[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作用于复杂数据类型
相关文章:
[C++深入] --- malloc/free和new/delete
1 new运算符的拓展 1.1 自由存储区与堆的概念 在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。 new操作符从自由存储区(free st…...
Spcok测试代码抛异常场景
测试代码抛异常场景 class ExceptionSpec extends Specification {def validateService new ValidateService()Unrolldef "验证UserInfo"() {when: "调用校验方法"validateService.validateUser(user)then: "捕获异常并设置需要验证的异常值&qu…...
【漏洞复现】脸爱云一脸通智慧管理平台 SystemMng 管理用户信息泄露漏洞(XVE-2024-9382)
0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大,运行稳定,操作简单方便,用户界面美观,轻松统计数据的一脸通系统。无需安装,只需在后台配置即可在浏览器登录。 功能包括:系统管理中心、人员信息管理中心、设备…...
新手如何入门Web3?
一、什么是Web3? Web3是指下一代互联网,它基于区块链技术,致力于将各种在线活动变得更加安全、透明和去中心化。Web3是一个广义的概念,涵盖了包括数字货币、去中心化应用、智能合约等在内的多个方面。它的主要特点包括去中心化、…...
React.FC`<ChildComponentProps>`解释
代码场景 ParentComponent.tsx import React, { useState } from react; import ChildComponent from ./ChildComponent;function ParentComponent() {const [childData, setChildData] useState<string>();const handleChildData (data: string) > { // 可以直接…...
2024-06-24力扣每日一题
链接: 503. 下一个更大元素 II 题意 循环数组,找出每个元素的往后最近且大于它的元素 解: 今天没试暴力啊,大概率是过不了的 思路就是先找到最大的数,最大数的结果肯定是-1,然后倒着遍历数组…...
pyhon模块以及常用的第三方模块
import my_info as info print(info.name) info.show()from my_info import * print(name) show() pyhon中包的导入 import admin.my_admin as ad # 包名.模块名 admin是包名,my_admin是模块名print(ad.name) print(ad.info())from admin import my_admin as ad # …...
shell脚本—快速修改centos网络配置
shell-文本中自行修改想要的配置 #!/bin/bash# 网卡名称 eth"eth0"# IP 地址 ipaddr"192.168.1.100"# 子网掩码 netmask"255.255.255.0"# 网关 gateway"192.168.1.1"# 写入配置文件 echo "BOOTPROTOstatic" > /etc/sysc…...
线程池概念、线程池的不同创建方式、线程池的拒绝策略
文章目录 💐线程池概念以及什么是工厂模式💐标准库中的线程池💐什么是工厂模式?💐ThreadPoolExecutor💐模拟实现线程池 💐线程池概念以及什么是工厂模式 线程的诞生是因为,频繁的创…...
示例:WPF中如何绑定ContextMenu和Menu
一、目的:开发过程中,有些模块的右键ContextMenu菜单是需要动态显示的,既是根据不同条件显示不同的菜单,很多是通过代码去生成ContextMenu的MenuItem,本文介绍通过绑定的方式去加载ContextMenu,Menu菜单栏的…...
区块链小故事
大灰狼与小白兔 一天兔子妈妈出门了,在大门上安装了一个区块链的门把手,这个门把手只有兔子妈妈、小兔子、以及另一个客人都同意的时候,才会开门,有一天客人a的钥匙丢了,被大灰狼捡到了,大灰狼于是去开门&…...
Java | Leetcode Java题解之第167题两数之和II-输入有序数组
题目: 题解: class Solution {public int[] twoSum(int[] numbers, int target) {int low 0, high numbers.length - 1;while (low < high) {int sum numbers[low] numbers[high];if (sum target) {return new int[]{low 1, high 1};} else i…...
项目训练营第三天
项目训练营第三天 注册登录测试 前面我们编写了用户注册、登录的逻辑代码,每编写完一个功能模块之后,我们都要对该模块进行单元测试,来确保该功能模块的正确性。一般情况下使用快捷键Ctrl Shift Insert,鼠标左击类名可以自动生…...
计算机组成原理 | CPU子系统(1)基本概述
基本结构模型 运算与缓存部件 数据寄存部件 PSW不是很清楚 存储器是什么?属于那个结构里? 时序处理部件 cpu是大脑,控制器是神经元 ①通过硬件产生控制信号 ②通过软件产生控制信号 外频(系统时钟信号),…...
无引擎游戏开发(2):最简游戏框架 | EasyX制作井字棋小游戏I
一、EasyX中的坐标系 不同于数理中的坐标系,EasyX中的y轴是竖直向下的 二、渲染缓冲区 之前的程序添加了这三个函数改善了绘图时闪烁的情况: 小球在"画布“上移动的过程就是我们在调用绘图函数,这个”画布“就是渲染缓冲区,先绘制的内…...
排书 IDA*
原题链接 题目描述 给定 n 本书,编号为 1∼n。 在初始状态下,书是任意排列的。在每一次操作中,可以抽取其中连续的一段,再把这段插入到其他某个位置。我们的目标状态是把书按照 1∼n 的顺序依次排列。求最少需要多少次操作。 输…...
playwright录制脚本原理
Paywright录制工具UI 在上一篇博客中介绍了如何从0构建一款具备录制UI测试的小工具。此篇博客将从源码层面上梳理playwright录制原理。当打开playwright vscode插件时,点击录制按钮,会开启一个新浏览器,如下图所示,在新开浏览器页…...
awk脚本监控
awk脚本监控 使用脚本监控内存,cpu和硬盘的根目录,超过80%提示用户,写成函数库的行,每天早上 的8.50分,执行一次脚本 现在脚本中写需要的内容 cpuu () {aa$(top -b -n 1 |awk NR3 {printf "%.F",$2$4})if …...
Python高压电容导电体和水文椭圆微分
🎯要点 🎯二维热传导二阶偏微分方程 | 🎯调和函数和几何图曲率 | 🎯解潮汐波动方程 | 🎯解静止基态旋转球体流体运动函数 | 🎯水文空间插值 | 🎯流体流动模拟求解器 | 🎯随机算法解…...
微信小程序 引入MiniProgram Design失败
这tm MiniProgramDesign 是我用过最垃圾的框架没有之一 我按照官网的指示安装居然能安装不成功,牛! 这里说明我是用js开发的 到以上步骤没有报错什么都没有,然后在引入组件的时候报错 Component is not found in path “./miniprogram _npm/vant/weapp/button/index” (using…...
电子认证合规护航跨境数字身份互认、国际数字身份互信
在数字中国建设与高水平对外开放协同推进的背景下,跨境贸易、金融合作与数字服务加速线上化,数字信任成为打通跨境交互壁垒的核心因素。电子认证作为网络空间信任体系的基石,其全流程合规不仅是自身服务运营的要求,更是护航跨境数…...
Claude Code 与 OpenClaw 分道扬镳:一场关于 AI 工具生态的深层博弈
Claude Code 与 OpenClaw 分道扬镳:一场关于 AI 工具生态的深层博弈 2025 年的开发者社区再次被一则消息引爆:Anthropic 决定不再允许 Claude Code 订阅用户使用 OpenClaw。这条消息在 Hacker News 上迅速获得了超过 590 票的热度,成为技术圈…...
【AI Agent革命性突破】:3大本质差异击穿传统自动化认知盲区,90%工程师至今未察觉
更多请点击: https://intelliparadigm.com 第一章:AI Agent与传统自动化的本质分水岭 决策机制的根本差异 传统自动化依赖预设规则与确定性流程(如 cron 任务、RPA 脚本),其执行路径在部署时即完全固化;而…...
首尔国立大学:AI读完“书“就扔掉笔记,竟比一直抄笔记更聪明?
这项由首尔国立大学数据科学研究生院主导的研究,以预印本形式发布于2026年5月,论文编号为arXiv:2605.06105,有兴趣深入了解的读者可以通过该编号查询完整论文。每次你问AI一个问题,它都要先把你给它的所有材料从头到尾读一遍&…...
告别命令行恐惧:可视化MT工具箱蜜罐版,让你的老旧小米路由器重获新生
可视化MT工具箱蜜罐版:零命令行复活老旧小米路由器的终极指南 你是否也有一个积灰多年的小米路由器?R1D、R3这些曾经的热门型号,如今因为官方固件功能有限而被闲置。传统方法需要复杂的命令行操作才能扩展功能,让许多非技术用户望…...
开源停车查询工具技术解析:从数据抓取到API服务的完整架构实践
1. 项目概述:一个开源停车查询工具的诞生最近在GitHub上看到一个挺有意思的项目,叫Harperbot/openclaw-parking-query。光看名字,你大概能猜到它和停车查询有关。没错,这是一个开源的停车信息查询工具,或者说ÿ…...
GitClaw:基于GitHub Actions的AI智能体框架,实现自动化代码审查与仓库管理
1. 项目概述:当GitHub遇上AI智能体最近在开源社区里,一个名为gitclaw的项目引起了我的注意。它来自open-gitagent组织,名字本身就很有意思——“Git Claw”,直译是“Git爪子”,听起来就像是要给GitHub这个代码仓库平台…...
NotebookLM多语言支持到底行不行?基于2000+跨语言笔记片段的BLEU-4与BERTScore双维度评测(含原始数据集下载链接)
更多请点击: https://intelliparadigm.com 第一章:NotebookLM多语言支持到底行不行?基于2000跨语言笔记片段的BLEU-4与BERTScore双维度评测(含原始数据集下载链接) NotebookLM 官方宣称支持“30语言”,但其…...
对比直接购买官方服务使用 Taotoken Token Plan 如何节省成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接购买官方服务使用 Taotoken Token Plan 如何节省成本 1. 个人开发者的成本挑战 对于独立开发者或小型团队而言࿰…...
保姆级教程:在Windows Server上为SQL Server 2012彻底搞定SQLNCLI11驱动安装与注册
Windows Server环境下SQLNCLI11驱动全流程部署指南 当你在全新的Windows Server系统上部署SQL Server 2012后,准备配置链接服务器时,突然发现提供程序列表中缺少关键的SQLNCLI11驱动——这种场景对于许多运维工程师和初级DBA来说并不陌生。本文将带你深入…...
