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

详解C++中动态内存管理和泛型编程

一、C/C内存区域划分1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等栈是向下增长的。2. 内存映射段是高效的I/O映射方式用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存做进程间通信。3. 堆用于程序运行时动态内存分配堆是可以上增长的。4. 数据段--存储全局数据和静态数据。5. 代码段--可执行的代码/只读常量。二、常见变量存储区域123456789101112131415intglobalVar 1;//全局变量中在静态区staticintstaticGlobalVar 1;//静态区voidTest(){staticintstaticVar 1;//静态区intlocalVar 1;//栈区intnum1[10] { 1, 2, 3, 4 };//栈区charchar2[] abcd;//栈区*char2在栈区constchar* pChar3 abcd;//指针在栈区*pchar3在常量区int* ptr1 (int*)malloc(sizeof(int) * 4);//指针在栈区*ptr1在堆区int* ptr2 (int*)calloc(4,sizeof(int));///栈区int* ptr3 (int*)realloc(ptr2,sizeof(int) * 4);//栈区free(ptr1);free(ptr3);}三、new和delete1、new和delete的使用方式12345678910111213intmain(){int* p1 newint;//在堆区申请一个int大小的空间不会初始化int* p2 newint(0);//申请并初始化为0deletep1;deletep2;int* p3 newint[10];//在堆区申请一块10个int大小的空间未初始化int* p4 newint[10]{ 1,2,3,4 };//初始化为{1,2,3,4,0,0,0,0,0,0}delete[] p3;delete[] p4;return0;}注意申请和释放单个元素的空间使用new和delete操作符申请和释放连续的空间使用new[]和delete[]一定要匹配起来使用。2、new、delete和malloc、free的区别1、对于内置类型没有区别。2、new和delete是C的关键字/操作符而malloc和free是C语言的库函数。3、对于自定义类型相比于malloc和freenew和delete会额外调用类中的构造函数和析构函数。4、malloc的返回值是void*使用时需要强转new后边跟的是空间的类型所以new不需要强转。5、malloc失败返回空指针需要判空new失败抛异常需要捕获异常。3、new的原理new等于operator new()构造函数。operator new()不是new运算符的重载因为参数没有自定义类型。它是一个库里的全局函数。1234567891011121314void*__CRTDECL operatornew(size_tsize) _THROW1(_STD bad_alloc){// try to allocate size bytesvoid*p;while((p malloc(size)) 0)if(_callnewh(size) 0){// report no memory// 如果申请内存失败了这里会抛出bad_alloc 类型异常staticconststd::bad_alloc nomem;_RAISE(nomem);}return(p);}从底层代码可以看出operator new()是对malloc的封装如果malloc失败将会抛出异常。4、delete的原理delete等于operator delete()析构函数12345678910111213141516171819//operator delete: 该函数最终是通过free来释放空间的voidoperatordelete(void*pUserData) {_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if(pUserData NULL)return;_mlock(_HEAP_LOCK);/* block other threads */__TRY/* get a pointer to memory block header */pHead pHdr(pUserData);/* verify block type */_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-nBlockUse));_free_dbg( pUserData, pHead-nBlockUse );//调用free()__FINALLY_munlock(_HEAP_LOCK);/* release other threads */__END_TRY_FINALLYreturn; }//free的实现#define free(p) _free_dbg(p, _NORMAL_BLOCK)从底层代码可以看出operator delete()调用了free。所以针对内置类型或无资源的类对象delete时使用delete和free效果相同。但对于有资源需要释放的对象时直接使用free虽然释放了对象的空间但对象内部的资源还未被清理导致内存泄漏这种情况必须使用delete。5、new T[N]原理1、new T[N]调用operator new[]2、operator new[]调用operator new完成N个对象空间的开辟。3、调用N次构造函数完成N个对象的初始化。6、delete[]原理1、调用N次析构函数完成N个对象资源的清理工作。2、调用operator delete[]3、operator delete[]调用operator delete完成整段空间的释放。四、定位new1、定位new的概念对于一个类我们可以显式的去调用类的析构函数但是不能显式调用构造函数那么使用定位new就可以显式调用类的构造函数对一块空间重新初始化。2、定位new的使用格式new (指针)类名或者new (指针) type(初始化列表)123456789intmain(){Date d1;new(d1)Date;//new (指针)类名Date* p newDate[4]{ {2022,10,15},{2023,11,8} };new(p)Date[4];//new (指针) type(初始化列表)delete[] p;return0;}上述代码一共调用了10次构造函数经过定位new的处理d1和p所代表的空间已经被重新初始化了。3、定位new的使用场景一般不会像上边代码一样对一块已有对象数据的空间重新初始化。定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化对于自定义类型的对象可以使用定位new对这些没有被初始化的内存显式调用类的构造函数初始化。五、泛型编程泛型编程编写与类型无关的通用代码是代码复用的一种手段。模板是泛型编程的基础。模板分为函数模板和类模板六、函数模板1、函数模板的使用123456789101112131415templatetypenameTvoidSwap(T a, T b){T tmp a;a b;b tmp;}intmain(){inta 10, b 5;doublem 2.3, n 4.9;Swap(a, b);Swap(m, n);return0;}两个Swap调用的不是模板而是模板生成的实例化函数像上述代码中模板会生成int和double类型的两种实例化函数。2、不同类型形参传参时的处理2.1传参时强转对应形参需要const修饰123456789101112templatetypenameTT Add(constT a,constT b)//const接收常性实参{returna b;}intmain(){inta 10, b 5;doublem 2.3, n 4.9;Add(a, (int)m);//强转临时变量传参具有常性return0;}使用强制类型转换在推演的时候将形参转换成同一类型。2.2显式实例化传参时隐式类型转对应形参需要const修饰123456789101112templatetypenameTT Add(constT a,constT b)//需要使用const接收{returna b;}intmain(){inta 10, b 5;doublem 2.3, n 4.9;Addint(a, m);//显式实例化m发生隐式类型转换return0;}显式实例化编译器不再去推演T的类型而是直接使用尖括号内的类型实例化对应函数。

相关文章:

详解C++中动态内存管理和泛型编程

一、C/C内存区域划分1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。3. 堆用于程序运行时动态内存…...

LitCAD:零基础快速掌握免费开源CAD绘图的终极指南

LitCAD:零基础快速掌握免费开源CAD绘图的终极指南 【免费下载链接】LitCAD A very simple CAD developed by C#. 项目地址: https://gitcode.com/gh_mirrors/li/LitCAD LitCAD是一款基于C#开发的免费开源二维CAD绘图软件,专为CAD初学者和工程绘图…...

终极Win11系统优化指南:Win11Debloat深度解析与实战应用

终极Win11系统优化指南:Win11Debloat深度解析与实战应用 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …...

Steam下载任务自动化管理系统:实现高效能计算资源调度

Steam下载任务自动化管理系统:实现高效能计算资源调度 【免费下载链接】SteamShutdown Automatic shutdown after Steam download(s) has finished. 项目地址: https://gitcode.com/gh_mirrors/st/SteamShutdown SteamShutdown是一款专为Steam平台设计的智能…...

加强 UA 检测规则

limit_req_zone $http_user_agent zoneua_limit:10m rate1r/m; location / {limit_req zoneua_limit burst1 nodelay;# 或直接返回 444if ($http_user_agent "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version…...

我做了个 Codex 账号切换器:终于不用担心token用量了

1.概述在人工智能快速发展的今天,AI不再仅仅是回答问题的聊天机器人,而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理,能够在用户的机器上安全高效地生成高质量的软件变…...

PyTorch分布式训练报错subprocess.CalledProcessError?别慌,先看看你代码里的‘b=c’

PyTorch分布式训练报错subprocess.CalledProcessError?别慌,先看看你代码里的‘bc’ 当你第一次尝试PyTorch分布式训练时,终端突然抛出subprocess.CalledProcessError,屏幕上堆满红色报错信息,这种体验就像刚拿到驾照就…...

Meditron数据预处理流程:医学文本清洗与增强技术详解

Meditron数据预处理流程:医学文本清洗与增强技术详解 【免费下载链接】meditron Meditron is a suite of open-source medical Large Language Models (LLMs). 项目地址: https://gitcode.com/gh_mirrors/me/meditron Meditron作为开源医疗大语言模型套件&am…...

Rust的匹配中的能力推理

Rust的匹配机制与能力推理:解锁安全高效的编程范式 Rust作为一门现代系统编程语言,以其内存安全和零成本抽象著称,而其中的模式匹配(Pattern Matching)与能力推理(Capability-based Reasoning)…...

Vue 3 Composition API:响应式系统与依赖追踪

# Vue 3 Composition API:响应式系统与依赖追踪> 标签:Vue,Composition API,响应式,依赖追踪,Proxy## 前言:为什么需要深入理解响应式系统?Vue 3 的 Composition API 不仅仅是一种新的代码组织方式,它建立在全新的响…...

3.人工智能实战:大模型显存频繁 OOM?从 KV Cache、上下文长度到量化推理的完整优化方案

人工智能实战:大模型显存频繁 OOM?从 KV Cache、上下文长度到量化推理的完整优化方案 一、问题场景:不是模型太大,是你没控制显存 在把推理服务切到 vLLM 之后,并发问题基本解决,但很快又遇到一个更隐蔽的…...

Geatpy旅行商问题(TSP)求解:编码策略与优化技巧

Geatpy旅行商问题(TSP)求解:编码策略与优化技巧 【免费下载链接】geatpy Evolutionary algorithm toolbox and framework with high performance for Python 项目地址: https://gitcode.com/gh_mirrors/ge/geatpy 旅行商问题(TSP)作为…...

【PHP 8.9 GC革命性突破】:内存泄漏率下降73%、循环引用回收提速4.8倍,你还在用PHP 8.1的旧回收器?

更多请点击: https://intelliparadigm.com 第一章:PHP 8.9垃圾回收机制的演进全景 PHP 8.9尚未正式发布(截至2024年,PHP最新稳定版为8.3),但作为社区广泛讨论的前瞻性演进方向,“PHP 8.9”在此…...

EasyAnimateV5-7b-zh-InP实现Web端视频编辑器:前端技术解析

EasyAnimateV5-7b-zh-InP实现Web端视频编辑器:前端技术解析 1. 引言 视频内容创作正变得越来越普及,但传统视频编辑软件往往需要专业知识和昂贵硬件。现在有了EasyAnimateV5-7b-zh-InP这样的AI模型,我们可以在Web端构建智能视频编辑器&…...

Phi-mini-MoE-instruct降本提效:相比70B模型节省85% GPU成本实测

Phi-mini-MoE-instruct降本提效:相比70B模型节省85% GPU成本实测 1. 项目概述 Phi-mini-MoE-instruct是一款轻量级混合专家(MoE)指令型小语言模型,在保持高性能的同时大幅降低了计算资源需求。该模型采用创新的MoE架构&#xff…...

Pi0镜像部署实测:16-18GB显存占用,消费级GPU可运行

Pi0镜像部署实测:16-18GB显存占用,消费级GPU可运行 1. 引言:具身智能的消费级突破 当机器人技术遇上大型语言模型,会擦出怎样的火花?Pi0(π₀)作为Physical Intelligence公司开发的视觉-语言-…...

Phi-3.5-mini-instruct助力Python爬虫开发:智能解析与反反爬策略生成

Phi-3.5-mini-instruct助力Python爬虫开发:智能解析与反反爬策略生成 1. 爬虫开发者的日常困境 每个Python爬虫开发者都经历过这样的痛苦时刻:盯着复杂的网页源代码,试图找出那个飘忽不定的数据节点;或是精心编写的爬虫运行到一…...

Cronsun快速部署教程:5分钟搭建高可用分布式任务调度平台

Cronsun快速部署教程:5分钟搭建高可用分布式任务调度平台 【免费下载链接】cronsun A Distributed, Fault-Tolerant Cron-Style Job System. 项目地址: https://gitcode.com/gh_mirrors/cr/cronsun Cronsun是一款强大的分布式任务调度系统,能够帮…...

LLM上下文窗口工程2026:超长上下文的正确使用姿势

上下文窗口军备竞赛背后的工程现实 2024年初,能处理32K token已经是旗舰模型的标配。到2026年,Gemini 1.5 Pro支持100万token,Claude支持20万token,GPT-4o也已扩展到128K。一本厚厚的技术书籍、一个中等规模的代码仓库、数月的对…...

Conda环境翻车?手把手教你用Python 3.8无痛安装pyani(附常见报错解决方案)

Python 3.8环境下pyani安装全攻略:从零开始到实战分析 在微生物基因组研究中,平均核苷酸相似度(ANI)分析是鉴定菌株亲缘关系的重要工具。而pyani作为一款专业的ANI计算工具,却常常让研究者们在安装阶段就遭遇"滑铁…...

2026最新!3款亲测免费视频转文字神器,10分钟转完2小时视频素材,好用到哭!

很多朋友找视频转文字工具,上来就盯着“全免费”薅羊毛,其实踩过坑的都知道,要么错字连篇改到吐,要么大视频转一半卡崩,算上你的时间成本反而亏大。我亲测了十几款2026年最新的工具,结论很明确:…...

Windows+CUDA 12.2+Anaconda环境:手把手教你从创建虚拟环境到成功验证PyTorch安装

Windows系统下CUDA 12.2与PyTorch环境配置全指南 在深度学习项目开发中,环境配置往往是第一个拦路虎。特别是当硬件与软件版本不匹配时,新手很容易陷入无休止的依赖冲突和安装失败循环。本文将带你完整走通Windows 11系统下CUDA 12.2与PyTorch的环境配置…...

别再只会addItem了!PyQt5 QComboBox的增删改查与事件绑定保姆级教程

解锁PyQt5 QComboBox的进阶玩法:从CRUD到动态交互实战 下拉选择框(QComboBox)是桌面应用开发中最常见的控件之一,但大多数开发者只停留在基础的addItem操作上。本文将带你从数据库CRUD的视角重新认识这个控件,并通过信…...

Netflix克隆项目测试策略:Jest与React Testing Library最佳实践

Netflix克隆项目测试策略:Jest与React Testing Library最佳实践 【免费下载链接】netflix Subscribe to my YouTube channel: https://bit.ly/CognitiveSurge - Building Netflix Using React 项目地址: https://gitcode.com/gh_mirrors/ne/netflix 在现代前…...

如何快速上手 Next.js App Router:10个必学的新特性解析

如何快速上手 Next.js App Router:10个必学的新特性解析 【免费下载链接】app-playground A playground to explore Next.js features such as nested layouts, instant loading states, streaming, and component level data fetching. 项目地址: https://gitcod…...

植物大战僵尸终极修改器:PvZ Toolkit 完全指南

植物大战僵尸终极修改器:PvZ Toolkit 完全指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 还在为植物大战僵尸中的资源限制而烦恼吗?PvZ Toolkit 是您需要的完美解决方案…...

TrustKit底层原理:深入理解公钥哈希算法与证书链验证机制

TrustKit底层原理:深入理解公钥哈希算法与证书链验证机制 【免费下载链接】TrustKit Easy SSL pinning validation and reporting for iOS, macOS, tvOS and watchOS. 项目地址: https://gitcode.com/gh_mirrors/tr/TrustKit TrustKit是一款为iOS、macOS、tv…...

MarkdownView高级特性探索:链接处理、渲染回调与滚动控制

MarkdownView高级特性探索:链接处理、渲染回调与滚动控制 【免费下载链接】MarkdownView Markdown View for iOS. 项目地址: https://gitcode.com/gh_mirrors/ma/MarkdownView MarkdownView是一款专为iOS平台设计的高效Markdown渲染组件,它不仅提…...

告别权限混乱:ASP.NET Core声明式授权的5个实战技巧

告别权限混乱:ASP.NET Core声明式授权的5个实战技巧 【免费下载链接】aspnetcore ASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux. 项目地址: https://gitcode.com/GitHub_Trendi…...

不止于流程图:用Mermaid.js在个人博客里轻松画时序图、甘特图和饼图

解锁文本绘图新维度:Mermaid.js在技术博客中的高阶应用 如果你厌倦了在博客中插入静态图片来展示技术概念,或者对频繁切换工具绘制各类图表感到疲惫,那么Mermaid.js可能会成为你内容创作的新宠。这个基于JavaScript的文本绘图工具&#xff0c…...