当前位置: 首页 > news >正文

C++ 动态内存管理详讲

1. 四个全局函数的定义与作用

这四个函数只负责空间的开辟和释放,不会调构造和析构

(1) ::operator new

cpp

void* operator new(size_t size);  // 全局版本
  • 功能:分配 size 字节的未初始化内存。

  • 底层实现:调用 malloc(size)

  • 调用场景

    • 直接调用:void* p = ::operator new(100);(手动分配 100 字节)。

    • 间接调用:new T 会先调用 operator new(sizeof(T)),然后调T构造函数初始化成员变量

(2) ::operator delete

cpp

void operator delete(void* ptr) noexcept;  // 全局版本
  • 功能:释放 operator new 分配的内存。

  • 底层实现:调用 free(ptr)

  • 调用场景

    • 直接调用:::operator delete(p),释放空间;

    • 间接调用:delete p 会先调用析构函数释放资源内存空间,再调用 operator delete(p)释放对象本身空间

(3) ::operator new[]

cpp

void* operator new[](size_t size);  // 全局版本
  • 功能:分配 size 字节的未初始化内存(用于数组)。

  • 底层实现:封装调用 operator new(size),更底层就是malloc

  • 调用场景

    • 直接调用:void* p = ::operator new[](100);

    • 间接调用:new T[n] 会先调用 operator new[](n * sizeof(T) + 额外空间),然后调用n次构造函数

(4) ::operator delete[]

cpp

void operator delete[](void* ptr) noexcept;  // 全局版本
  • 功能:释放 operator new[] 分配的内存。

  • 底层实现:调用 operator delete(ptr)(即 free)。

  • 调用场景

    • 直接调用:::operator delete[](p);

    • 间接调用:delete[] p 会先调用n次析构函数释放资源,再调用 operator delete[](p)释放整块对象本身空间


2. 与 new/delete 的关系

操作底层调用额外行为
new T::operator new(sizeof(T))调用构造函数
delete p::operator delete(p)先调用析构函数
new T[n]::operator new[](n * sizeof(T) + 额外)调用 n 次构造函数
delete[] p::operator delete[](p)先调用 n 次析构函数

关键区别

  • operator new/delete 只负责 内存分配/释放,不涉及构造/析构。

  • new/delete 是 更高层的操作,会额外调用构造/析构函数。

3. 为什么需要额外空间?

当使用 new T[n] 时:

  • 如果 T 是内置类型(如 intchar在释放时只需要释放内存,无需调用析构函数,因此开辟空间时可能不需要额外空间

  • 如果 T 是自定义类型(有析构函数)delete[] 必须知道数组大小 n,才能正确调用 n 次析构函数。

问题delete[] 如何知道 n
答案:编译器会在 operator new[] 分配的内存中隐式插入 n,通常是存储在返回指针之前的额外空间里。

4. 额外空间的存储方式

(1) 典型的内存布局

[对象数量 n][T 对象 0][T 对象 1]...[T 对象 n-1]↑p(返回给用户的指针)
  • p 是用户得到的指针,指向第一个对象 T[0]

  • p - sizeof(size_t) 的位置可能存储 n(具体偏移量由编译器决定)。

(2) 分配的总大小

operator new[] 实际分配的内存大小:

cpp

总大小 = sizeof(T) * n + 额外空间(存储 n 或其他元数据)=sz(传参) + sizeof(n)  
  • 额外空间的大小

    • 可能是 sizeof(size_t)(存储 n)。


5. delete[] 如何利用额外空间?

当调用 delete[] p 时:

  1. 定位 n

    • 编译器生成代码,从 p - offset 处读取 noffset 是编译器决定的,通常是 sizeof(size_t))。

  2. 调用析构函数

    • 逆序调用 n 次析构函数(从 p[n-1] 到 p[0])。

  3. 释放内存

    • 调用 operator delete[](original_ptr),其中 original_ptr 是 operator new[] 返回的原始指针(比 p 小,指向分配块的起始地址)。


6. 关键问题解答

(1) 为什么 new[] 和 delete[] 必须配对使用?

  • new[] 可能分配额外空间存储 n,而 delete[] 依赖这个信息调用析构函数。

(2) 如何手动模拟 new[] 和 delete[]

cpp

// 手动实现 new[]
void* operator new[](size_t size) {size_t total_size = size + sizeof(size_t);  // 额外空间存 nvoid* ptr = malloc(total_size);*(size_t*)ptr = size / sizeof(T);  // 存储 nreturn (char*)ptr + sizeof(size_t);  // 返回用户指针
}// 手动实现 delete[]
void operator delete[](void* p) noexcept {size_t* hidden_n = (size_t*)p - 1;size_t n = *hidden_n;for (size_t i = n; i > 0; --i) {((T*)p)[i - 1].~T();  // 调用析构函数}free(hidden_n);  // 释放原始指针
}

关键字

1. new 和 delete 的行为

(1) new 的流程(T* p = new T(args);
  1. 调用 operator new(sizeof(T)) 开辟空间。

  2. 在分配的内存上调用 T 的构造函数初始化成员变量(如果是内置类型,无构造步骤)。

  3. 返回指向对象的指针。

(2) delete 的流程(delete p;
  1. 调用 p 指向对象的析构函数释放资源空间(如果是内置类型,无析构步骤)。

  2. 调用 operator delete(p) 释放对象本身空间。


2. new[] 和 delete[] 的行为

(1) new[] 的流程(T* p = new T[n];
  1. 调用 operator new[](sizeof(T) * n) 分配内存。

    • 额外空间可能存储对象数量(编译器实现相关)。

  2. 对每个元素依次调用构造函数初始化成员变量(从 p[0] 到 p[n-1])。

(2) delete[] 的流程(delete[] p;
  1. 对每个元素逆序调用析构函数释放资源空间(从 p[n-1] 到 p[0])。

  2. 调用 operator delete[](p) 释放对象本身空间。

相关文章:

C++ 动态内存管理详讲

1. 四个全局函数的定义与作用 这四个函数只负责空间的开辟和释放,不会调构造和析构 (1) ::operator new cpp void* operator new(size_t size); // 全局版本 功能:分配 size 字节的未初始化内存。 底层实现:调用 malloc(size)。 调用场…...

纹理对象创建

纹理对象通俗点就是贴图,像游戏的皮肤什么就是纹理。常间的结构就是激活纹理单元(0-15有16个),将纹理对象挂在纹理单元上,纹理采样器需要采哪个样品就与哪个单元挂钩就行了,加载纹理对象需要用到stb_image库…...

如何利用dify 生成Fine‑tune 需要的Alpaca 格式数据

如果你选择llamafactory 格式进行微调,它只是格式是Alpaca格式,dify 的agent dsl 如下,你可以导入本地的dify 或者导入cloud 版本的;测试版本是0.1.5 app:description: 上传文件,基于文件内容,使用 Silico…...

软件第三方测试:关键部分、意义、流程及方法全解析?

软件第三方测试是保障软件质量的关键部分,它由专业的机构来开展,这个机构不隶属于开发方和使用方,能以客观公正的视角找出软件问题。 测试意义 软件第三方测试意义重大,它依靠专业技术,依照严格流程,对软…...

贪心算法解决会议安排问题

文章目录 前言 一、什么是贪心算法? 贪心算法的基本概念:贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。 二、会议安排题目 1.题目理解 2.思路剖析 总结 前言 本文将主要介绍贪心算法需要注意的地方以…...

高露洁牙膏是哪个国家的品牌?高露洁牙膏哪一款最好?

高露洁是来自于美国一个比较有知名度的品牌,在1806年的时候创立。总部是在美国纽约公园大道,在1873年时,高露洁就已经开始销售罐装牙膏。 在1896年时期推出可折叠管牙膏,在口腔护理产品发展的过程中拥有着不容忽视的地位。在1992…...

lin接口在线计算数据帧的校验位

在线校验计算链接:https://linchecksumcalculator.machsystems.cz/ 插入图片:...

Linux-07-Shell

一、Shell概述: Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核 二、Shell中的变量: 1.系统预定义的变量: $HOME,$PWD,$SHELL,$USER等 2.用户自定义的变量: (1).基本语法: 定义变量:变量名变量值,注意前后不能…...

【云盘】使用阿里云盘托管项目大文件

【云盘】使用阿里云盘托管项目大文件 由于经常需要切换服务器运行项目实验,不同服务器在项目实验过程中会产生不同的数据、模型等较大文件,不能像代码那样能够使用git托管,因此考虑使用阿里云盘作为”第三方平台“托管这些大文件。 一、使用…...

《缓存策略:移动应用网络请求的“效能密钥” 》

用户体验无疑是重中之重,而网络请求性能,恰似一座桥梁,连接着用户与应用丰富的内容和功能。当网络不佳或者请求频繁时,缓慢的响应速度常常让用户兴致索然,甚至可能导致用户流失。此时,缓存策略就如同一位幕…...

深入解析C++11委托构造函数:消除冗余初始化的利器

一、传统构造函数的痛点 在C11之前,当多个构造函数需要执行相同的初始化逻辑时,开发者往往面临两难选择: class DataProcessor {std::string dataPath;bool verbose;int bufferSize; public:// 基础版本DataProcessor(const std::string&am…...

文章七《深度学习调优与超参数优化》

🚀 文章7:深度学习调优与超参数优化——你的AI模型需要一场"整容手术" 一、模型调优核心策略:像调整游戏装备一样优化模型 1. 学习率调整:掌控训练的"油门踏板" 比喻:把模型训练想象成赛车游戏&…...

python入门(1)变量与输入输出

一、变量 使用规则 变量名值例子 a13变量名规则 变量名可以用大小写字母、数字、下划线。 数字、下划线不可开头 例子 name name1 1name name_first _first 二、输入输出 输出print print(*objects,sep"",end"\n") objects:多个要输出的值 sep:每个…...

藏文情感分析器入门学习实践

🎯 项目目标: 输入一段藏文短句。自动分析这句话的情感倾向:积极(正面)/消极(负面)/中立。 🔍 技术原理简介 情感分析是什么? 情感分析(Sentiment Analysi…...

爱胜品ICSP YPS-1133DN Plus黑白激光打印机报“自动进纸盒进纸失败”处理方法之一

故障现象如下图提示: 用户的爱胜品ICSP YPS-1133DN Plus黑白激光打印机在工作过程中提示自动进纸盒进纸失败并且红色故障灯闪烁; 给出常见故障一般处理建议如下: 当您的爱胜品ICSP YPS-1133DN Plus 黑白激光打印机出现“自动进纸盒进纸失败”…...

数据库索引重建与优化操作在数据库性能维护与数据更新频繁场景下的应用

数据库索引重建与优化操作在数据库性能维护与数据更新频繁场景下的应用 数据库索引的作用与重要性 索引的定义与作用 数据库索引是一种特殊的数据结构,用于加快数据库表的数据检索速度。它类似于书籍的目录,能够快速定位到需要的数据页,而不必…...

前端应用开发技术历程的简要概览

前端应用开发技术详解 一、萌芽期&#xff08;1990s - 2004&#xff09; 技术特征 HTML 3.2 / HTML 4.01 是主流版本。 样式用 CSS1/CSS2&#xff0c;但大部分样式写在 <style> 标签甚至行内。 动态效果主要通过 JavaScript 控制 DOM&#xff0c;兼容性极差。 代表事…...

SPOJ 11576 TRIP2 - A Famous King’s Trip 【Tarjan+欧拉回路】

自我吐槽 &#xff08;哭 题目传送门 SPOJ 洛谷 题目大意 让你在简单无向图上删去2条边&#xff0c;使该图联通并存在欧拉回路 输出字典序最小的一对边 思路 考虑到存在欧拉回路的充要条件&#xff0c;即 i n x ≡ 0 ( m o d 2 ) ∀ i ( 1 ≤ i ≤ n ) in_x\equiv 0 (\m…...

DeepSeek R1:强化学习范式的推理强化模型

定位与目标 DeepSeek R1 的推出并非 DeepSeek V3 的简单迭代,而是一次在训练范式上的大胆探索。与传统大模型主要依靠监督微调(SFT)后进行强化学习不同,R1 将重点放在推理能力和行为对齐上,尝试通过大规模强化学习直接激发模型的推理潜力。其目标是利用强化学习的反馈机制,…...

ubuntu22.04安装显卡驱动与cuda+cuDNN

背景&#xff1a; 紧接前文&#xff1a;Proxmox VE 8.4 显卡直通完整指南&#xff1a;NVIDIA 2080 Ti 实战。在R740服务器完成了proxmox的安装&#xff0c;并且安装了一张2080ti 魔改22g显存的的显卡。配置完了proxmox显卡直通&#xff0c;并将显卡挂载到了vm 301&#xff08;…...

使用python爬取百度搜索中关于python相关的数据信息

Python爬取百度搜索"Python"相关数据信息 一、准备工作 在开始爬取之前&#xff0c;需要了解以下几点&#xff1a; 百度搜索有反爬机制&#xff0c;需要合理设置请求头百度搜索结果页面结构可能会变化需要遵守robots.txt协议&#xff08;百度允许爬取搜索结果&…...

Bootstrap(自助法)​​:无需假设分布的统计推断工具

核心思想​​ Bootstrap 是一种​​重采样&#xff08;Resampling&#xff09;技术​​&#xff0c;通过在原始数据中​​有放回地重复抽样​​&#xff0c;生成大量新样本集&#xff0c;用于估计统计量&#xff08;如均值、方差&#xff09;的分布或模型性能的不确定性。 ​​…...

lib和dll介绍和VS2019生成实例

目录 lib文件和dll文件的作用dll和lib的优缺点VS2019 编译YOLOv5的dll和lib lib文件和dll文件的作用 (1)lib是编译时需要的&#xff0c;dll是运行时需要的。 如果要完成源代码的编译&#xff0c;有lib就够了。 如果也使动态连接的程序运行起来&#xff0c;有dll就够了。 在开发…...

tinycudann安装过程加ubuntu18.04gcc版本的升级(成功版!!!!)

使用的是 Linux&#xff0c;安装以下软件包 sudo apt-get install build-essential git安装 CUDA 并将 CUDA 安装添加到您的 PATH。 例如&#xff0c;如果您有 CUDA 12.6.3&#xff0c;请将以下内容添加到您的/usr/local/~/.bashrcexport PATH"/usr/local/cuda-12.6.3/bi…...

数字智慧方案5869丨智慧健康医疗养老大数据整体规划方案(76页PPT)(文末有下载方式)

资料解读&#xff1a;智慧健康医疗养老大数据整体规划方案 详细资料请看本解读文章的最后内容。 随着科技的飞速发展&#xff0c;健康医疗领域正经历着一场深刻的变革。特别是在大数据和人工智能技术的推动下&#xff0c;智慧健康医疗养老的整体规划方案逐渐浮出水面。本文将…...

使用huggingface_hub需要注意的事项

在安装huggingface_hub的时候要注意如果你的python是放在c盘下时记得用管理员模式命令行来安装huggingface_hub&#xff0c;否则安装过程会报错&#xff0c;之后也不会有huggingface-cli命令。 如果安装时因为没有用管理员权限安装而报错了&#xff0c;可以先卸载huggingface-…...

Matplotlib核心课程-2

4.1 数据加载、储存 4.1.1 从数据文件读取数据 导入支持库&#xff1a; import numpy as np from pandas import Series,DataFrame import pandas as pd 从csv文件读取数据&#xff0c;一般方法&#xff1a; pd.read_csv(../data/ex1.csv,encodinggbk) 从csv文件读取数据&#…...

友元函数和友元类

友元 友元是 C 提供的一种 打破封装 的机制&#xff0c;允许 友元函数 或 友元类 访问某个类的 非公有成员&#xff08;private/protected&#xff09;。 友元函数 友元函数 可以 直接访问 类的所有 成员&#xff0c;它是 定义在类外部 的 普通函数 &#xff0c;不属于任何类…...

5.2刷题

P1064 [NOIP 2006 提高组] 金明的预算方案 背包&#xff0b;附属品DP #include<bits/stdc.h> using namespace std; #define int long long int n, m, v, p, q; struct node{int id, v, s, f; }a[100]; int b[32010], dp[32010]; bool cmp(node a, node b){if(a.id b.…...

用VNA进行天线阻抗匹配的实例大图

比如我这天线&#xff0c;在7Mhz时不谐振&#xff0c;我进行匹配 天线的阻抗很高&#xff0c;大约是在500-1400欧&#xff0c;而等效电容电感很小。 所以我考虑使用阻抗变压器降低阻抗。 1。测试天线阻抗&#xff0c;电阻相当高&#xff0c;等效电容很小。 2。通过磁环匹配到…...

普通IT的股票交易成长史--20250502 突破(1)

声明&#xff1a;本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。文中观点基本来自yt站方方土priceaction&#xff0c;综合自己的观点得出。感谢他们的无私分享。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#…...

[预备知识]5. 优化理论(一)

优化理论 梯度下降&#xff08;Gradient Descent&#xff09; 数学原理与可视化 梯度下降是优化领域的基石算法&#xff0c;其核心思想是沿负梯度方向迭代更新参数。数学表达式为&#xff1a; θ t 1 θ t − α ∇ θ J ( θ t ) \theta_{t1} \theta_t - \alpha \nabla…...

AI人工智能的接入和使用

缘起 从参加工作开始就在从事AI的落地和接入&#xff0c;到现在已经25年了。所以对AI一直有种情怀&#xff0c;还写了一系列的《基于语音识别的智能电子病历》的文章&#xff0c;记录了这条路上的潮起潮落。 年少多痴狂 2015年开始负责开发语音识别引擎语义分析&#xff0c;…...

QT6(32)4.5常用按钮组件:Button 例题的代码实现

&#xff08;103&#xff09; 先设置对齐&#xff1a; 再设置粗体、斜体、下划线&#xff1a; 给出这三个按钮的源码; 颜色按钮的实现 &#xff1a; 至此完结&#xff0c;谢谢老师们的无私教导。 &#xff08;104&#xff09; 谢谢...

B站Michale_ee——ESP32_IDF SDK——FreeRTOS_8 消息缓冲区

Message Buffer&#xff08;消息缓冲区&#xff09;与Stream Buffer&#xff08;流数据缓冲区&#xff09;类似&#xff0c;但有2点不同&#xff1a; Message Buffer每次只接收1次完整的Message;Message Buffer接收缓冲区小于1条Message大小时&#xff0c;会接收不到数据&#…...

DarkGS:论文解读与全流程环境配置及数据集测试【基于Ubuntu20.04 】【2025最新实战无坑版!!】

一、背景及意义 DarkGS是一个创新性的研究项目&#xff0c;旨在解决机器人在黑暗或低光照环境中探索的问题。传统的3D重建和视觉定位系统在光照条件不佳时表现不佳&#xff0c;这严重限制了机器人在黑暗环境中的应用&#xff0c;如夜间救援、深海探索或洞穴勘测等场景。 这项工…...

【大模型面试每日一题】Day 6:分布式训练中 loss 出现 NaN,可能原因及排查方法?

【大模型面试每日一题】Day 6&#xff1a;分布式训练中 loss 出现 NaN&#xff0c;可能原因及排查方法&#xff1f; &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官&#xff1a;你在使用 PyTorch 进行大规模语言模型的分布式训练时&#xff0c;发现 loss 变成 Na…...

[面试]SoC验证工程师面试常见问题(二)

SoC验证工程师面试常见问题(二) 摘要:面试SoC验证工程师时,SystemVerilog (SV) 和 UVM (Universal Verification Methodology) 是核心技能,而AXI总线是现代SoC中最常见的接口协议之一,因此也是必考点。以下是可能被问到的问题及优质答案的详细列表: 一、 System…...

BLE协议栈的解析

目录 概述 1 BLE协议栈层次结构 1.1 控制器&#xff08;Controller&#xff09; 1.2 主机&#xff08;Host&#xff09; 1.3 应用层(Application) 1.3.1 业务层功能 1.3.2 实现方法 2 重要属性介绍 2.1 GATT属性 2.2 服务&#xff08;Service&#xff09; 2.3 特征值…...

中小企业MES系统需求文档

适用对象&#xff1a;中小型离散制造企业&#xff08;年产值1-5亿&#xff0c;员工200-800人&#xff09; 版本&#xff1a;V1.0 日期&#xff1a;2025年5月2日 一、业务背景与目标 1.1 现状痛点 生产黑箱化&#xff1a;车间进度依赖人工汇报&#xff0c;异常响应延迟>2小…...

邹晓辉教授十余年前关于围棋程序与融智学的思考,体现了对复杂系统本质的深刻洞察,其观点在人工智能发展历程中具有前瞻性意义。我们可以从以下三个维度进行深入解析:

邹晓辉教授十余年前关于围棋程序与融智学的思考&#xff0c;体现了对复杂系统本质的深刻洞察&#xff0c;其观点在人工智能发展历程中具有前瞻性意义。我们可以从以下三个维度进行深入解析&#xff1a; 一、围棋程序的二元解构&#xff1a;数据结构与算法的辩证关系 1.1.形式…...

JAVA继承详细总结

看前摇一摇这篇文章:java 继承 补充&#xff1a;子类能继承父类中的哪些内容&#xff1f; - 小澳子 - 博客园 构造方法的继承规则 Java 中构造方法不会被子类继承。JLS 明确指出“构造方法不是类的成员&#xff0c;因此永远不会被继承”docs.oracle.com。博客原文在“继承内存…...

AntSK:基于大模型的一体化AI知识库解决方案深度解析

随着大模型&#xff08;如GPT、LLM&#xff09;技术的飞速发展&#xff0c;企业对智能知识管理和专属AI助手的需求日益增长。AntSK 正是在这一背景下诞生的企业级AI一体机解决方案。本文将从技术架构、核心功能、创新点和应用场景等方面&#xff0c;深入解析 AntSK 如何助力企业…...

C++11新特性_标准库_std::array

std::array 是 C11 标准库引入的一个容器&#xff0c;用于表示固定大小的数组。它定义在 <array> 头文件中。下面为你详细介绍其优势和使用方法。 优势 1. 类型安全 与传统的 C 风格数组不同&#xff0c;std::array 是一个模板类&#xff0c;它的类型信息在编译时就已…...

【AI面试准备】数据治理与GDPR脱敏机制构建

介绍数据治理&#xff1a;构建符合GDPR的测试数据脱敏机制。如何快速掌握&#xff0c;以及在实际工作中如何运用。 数据治理是确保数据质量、安全性和合规性的系统性方法&#xff0c;而构建符合GDPR&#xff08;《通用数据保护条例》&#xff09;的测试数据脱敏机制是其中的关…...

A2A Python 教程 - 综合指南

目录 • 介绍• 设置环境• 创建项目• 代理技能• 代理卡片• A2A服务器• 与A2A服务器交互• 添加代理功能• 使用本地Ollama模型• 后续步骤 介绍 在本教程中&#xff0c;您将使用Python构建一个简单的echo A2A服务器。这个基础实现将向您展示A2A提供的所有功能。完成本教…...

Linux:信号(一)

1. 信号是什么 信号的概念 Linux中信号(Signal)是进程间通信的一种基本机制&#xff0c;用于通知进程发生了某种事件或异常。信号是异步的&#xff0c;可能由操作系统、其他进程或进程自身触发。 kill -l 指令查看所有的信号 上面的SIGHUP、SIGINT本质就是define宏定义&…...

数据中台笔记01

一、数据中台大纲 1.1、 课程概述 1)数据中台诞生的背景和历史 核心价值:解决企业"重复造轮子"问题,通过统一平台实现多业务数据关联。典型问题:数据质量监控、血缘关系管理等场景的标准化处理。行业需求:阿里等企业实践验证了中台模式在数据治理中的必要性。2…...

[面试]SoC验证工程师面试常见问题(四)

SoC验证工程师面试常见问题(四) 摘要:作为 SoC 验证工程师,面试中可能会被问及与片内互联技术和具体协议(如 PCIe)相关的问题。这些问题通常旨在评估你对 SoC 架构、互联协议的理解以及验证这些技术的实践经验。以下是针对片内互联技术和 PCIe 协议可能提出的问题…...

流水线相关计算【计算机组成与体系结构】

一些概念 流水线周期 &#xff08;T_cycle&#xff09; 最长操作阶段耗时&#xff0c;决定整体节奏。若取指2ns&#xff0c;分析3ns&#xff0c;执行1ns&#xff0c;则流水线周期3ns&#xff08;取最大值&#xff09;如《笑傲江湖》中“独孤九剑”的九式&#xff0c;最慢一式&a…...