C++内存管理基础知识
C++ 内存管理
- C++内存管理是一个重要的主题,因为它涉及到程序运行时资源的分配和释放。它可以分为三种类型:静态内存、栈内存和堆内存。
静态内存
静态内存(Static Memory):静态内存用于存储全局变量、静态变量和常量。
这些变量在程序启动时分配内存,在程序结束时释放。静态内存分配的大小是固定的,不能在运行时改变。
示例:
// 全局变量
int global_var;// 静态变量
void func() {static int static_var;
}// 常量
const int const_var = 42;
栈内存
栈内存(Stack Memory):主要用于
存储局部变量和函数调用时的信息。
- 当一个函数被调用时,栈空间被分配,函数执行完毕后,分配的栈空间被释放。
- 栈内存分配和释放速度快,但空间有限。在C++中,局部变量默认存储在栈内存中。
堆内存
堆内存(Heap Memory):主要用于程序在运行时从操作系统动态分配的内存。与栈内存不同,堆内存的分配和释放需要手动进行。这使得程序可以根据需要灵活地分配内存,但也增加了管理复杂性。在C++中,可以使用new和delete操作符在堆内存中分配和释放对象。
new 与 delete
-
new :使用new操作符在堆上分配内存,并返回指向该内存的指针。new会自动调用对象的构造函数。
-
delete:delete操作符用于释放内存并调用对象的析构函数。使用new和delete时,需要确保正确匹配它们,以避免内存泄漏。
示例:
int *p = new int; // 在堆上分配一个整数内存
*p = 42; // 赋值
delete p; // 释放内存
动态内存分配和释放的注意事项
- 避免内存泄漏:务必确保为每个使用new分配的内存调用delete进行释放。
- 避免野指针:在释放内存后,将指针设置为nullptr,避免使用已经释放的内存。
- 避免重复释放:确保不要多次释放同一块内存。
智能指针
为了简化内存管理,C++11引入了
智能指针,它们可以自动管理内存资源。智能指针在其作用域结束时自动释放内存,降低了内存泄漏的风险。同时智能指针也是一种对象,它的行为类似于指针,但在某种程度上自动管理指向的内存。
- C++11引入了三种类型的智能指针:unique_ptr、shared_ptr和weak_ptr。
unique_ptr智能指针
unique_ptr是一种独占所有权的智能指针。
它保证同一时间只能有一个unique_ptr指向对象。当unique_ptr离开作用域或被重置时,它会自动删除所指向的对象。
示例:
#include <memory>unique_ptr<int> uptr(new int(42));// 转移所有权
unique_ptr<int> uptr2 = move(uptr);
unique_ptr不能通过拷贝构造函数或拷贝赋值来创建,但可以使用move转移所有权。
shared_ptr智能指针
shared_ptr是一种共享所有权的智能指针。它允许多个shared_ptr指向同一个对象。shared_ptr使用引用计数器跟踪指向对象的智能指针数量。
当最后一个指向对象的shared_ptr离开作用域或被重置时,对象会被自动删除。
示例:
#include <memory>shared_ptr<int> sptr1(new int(42));
shared_ptr<int> sptr2 = sptr1; // 引用计数增加
weak_ptr智能指针
weak_ptr是一种不增加引用计数的智能指针,通常与shared_ptr一起使用。weak_ptr可以观察shared_ptr所指向的对象,但不会增加引用计数。
当所有指向该对象的shared_ptr都不再引用对象时,weak_ptr会自动失效。这可以避免循环引用导致的内存泄漏。
示例:
#include <memory>shared_ptr<int> sptr(new int(42));
weak_ptr<int> wptr(sptr); // 引用计数不变if (auto locked = wptr.lock()) { // 尝试获得一个 shared_ptr// 使用 *locked 访问对象
} else {// 对象已经被删除
}
- weak_ptr没有提供直接访问所指向对象的方法,需要通过调用lock()方法尝试获取一个shared_ptr。如果lock()成功,说明对象仍然存在,可以使用返回的shared_ptr安全地访问对象。如果lock()失败,说明对象已经被删除。
智能指针的使用可以减轻手动管理内存的负担,降低内存泄漏和悬空指针的风险。在实际开发中,推荐尽量使用智能指针代替裸指针,以提高代码的安全性和健壮性。
总结
- 总结一下,C++内存管理包括静态内存、栈内存和堆内存,涉及到变量的生命周期和内存的分配与释放。
- 通过熟练掌握栈内存、堆内存和静态内存的特点,以及学会使用智能指针,可以编写出更安全、高效的C++代码。在实际项目中,内存管理是编写高质量C++代码的关键要素之一。
相关文章:
C++内存管理基础知识
C 内存管理 C内存管理是一个重要的主题,因为它涉及到程序运行时资源的分配和释放。它可以分为三种类型:静态内存、栈内存和堆内存。 静态内存 静态内存(Static Memory):静态内存用于存储全局变量、静态变量和常量。这…...
命令执行漏洞概述
命令执行漏洞概述 命令执行定义命令执行条件命令执行成因命令执行漏洞带来的危害远程命令执行漏洞相关函数assert()preg_replace()call_user_func() a ( a( a(b)可变函数远程命令执行漏洞的利用系统命令执行漏洞相关函数system()exec()shell_exec()passthru(&#x…...
【初试复试第一】脱产在家二战上岸——上交819考研经验
笔者来自通信考研小马哥23上交819全程班学员 先介绍一下自己,我今年初试426并列第一,加上复试之后总分600,电子系第一。 我本科上交,本科期间虽然没有挂科但是成绩排名处于中下游水平。参加过全国电子设计大赛,虽然拿…...
PTA:C课程设计(7)
山东大学(威海)2022级大一下C习题集(7) 函数题7-6-1 递增的整数序列链表的插入7-6-2 查找学生链表7-6-3 统计专业人数7-6-4 建立学生信息链表 编程题7-7-1 查找书籍7-7-2 找出总分最高的学生 函数题 7-6-1 递增的整数序列链表的插…...
POSTGRESQL LINUX 与 PG有关的内存参释义
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…...
Docker的常见命令
前言:使用Docker得学会的几个常见命令 常见命令前置学习: docker --help这个命令必须得会因为,很多命令是记不住的,得使用他们的官方help下面是一些实例 docker load --help常见命令集合: 一: docker images #查看全部镜像 docker rmi #删除某个镜像(例如:docker rmi redis…...
详细介绍性能测试的方法(含文档)
性能测试是软件测试中的一个重要环节,其目的是评估系统在不同负荷下的性能表现,包括响应时间、吞吐量、并发数等指标。通常可以通过以下几种方法进行性能测试: 1、负载测试 负载测试是模拟多用户同时访问系统,测试系统在高并发、…...
深入剖析 Qt QHash :原理、应用与技巧
目录标题 引言QHash 基础用法基础用法示例基础用法综合示例 QHash 的高级用法迭代器:遍历 QHash 中的元素(Iterators: Traversing Elements in QHash )QHash和其他容器的对比QHash 和 std::unordered\_map QHash的底层原理和内存管理QHash 的…...
技术分享 | MySQL级联复制下进行大表的字段扩容
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生开源社区出品,…...
工业互联网业务知识
文章目录 背景第四次工业革命带动制造业产业升级主要工业大国不同路径 架构ISA95体系架构变革趋势基础通用架构数据采集平台 工业互联网应用软件工业互联网全要素连接产品视角:产销服务企业的业务流程企业数字化改造:车间级全要素连接 工业互联网的产品体…...
jsp+java自行车租赁租借和买卖系统
自行车租借和买卖系统 系统包括四个模块。1,系统模块,2,车辆管理模块,3.租借车管理模块,4,买卖车管理模块。 1,系统模块包括: 连接数据库,工作人员登录,退出。 2&#…...
Python3 字符串
Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( 或 " )来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 Hello World! var2 "Runoob" Python 访问字符串中的值 Python 不支持单字符…...
Day943.持续集成流水线 -系统重构实战
持续集成流水线 Hi,我是阿昌,今天学习记录的是关于持续集成流水线的内容。 从团队协作的角度上来看,在版本发布过程中,经常出现测试依赖开发手工生成制品、版本发布也从开发本地出版本的问题。而且项目架构如果从单体演进至组件…...
How to use CCS to debug a running M4F core that was started by Linux?
参考FAQ:AM62x & AM64x: How to use CCS to debug a running M4F core that was started by Linux? 问题记录: 1.使用SD卡启动模式,板上运行Linux。 当Linux系统启动后,9表示M4F core: am64xx-evm login: root rootam64xx…...
216、组合总数III
难度:中等 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7…...
简单的重装系统教程
郁闷,最近电脑一直蓝屏重启,用 2 分钟就蓝屏一次,遂产生重装系统的想法。 准备 U盘(8G或以上) PE 工具: 微PE工具箱快速指引 | 微PE优盘使用说明书 (wepe.com.cn) 系统镜像: 官网 Windows 10 官网 Windows 11 M…...
机器学习---集成学习报告
1.原理以及举例 1.1原理 集成学习(Ensemble Learning)是一种机器学习策略,它通过结合多个基学习器(base learners)的预测来提高模型的性能。集成学习的目标是创建一个比单个基学习器更准确、更稳定的最终预测模型。这…...
教你如何将PDF文件转换成PPT演示文稿
在工作和学习中,我们可能需要将一些PDF文件转换成PPT演示文稿,以便于更好地展示和分享。虽然PPT和PDF是两种不同的文档格式,但是我们可以使用一些专业的软件或在线工具来实现这种转换。下面就让我们来教你如何将PDF文件转换成PPT演示文稿。 …...
涨点技巧: 谷歌强势推出优化器Lion,引入到Yolov5/Yolov7,内存更小、效率更高,秒杀Adam(W)
1.Lion优化器介绍 论文:https://arxiv.org/abs/2302.06675 代码:automl/lion at master google/automl GitHub 1.1 简单、内存高效、运行速度更快 1)与 AdamW 和各种自适应优化器需要同时保存一阶和二阶矩相比,Lion 只需要动量,将额外的内存占用减半; 2)由于 Lion…...
Windows GPU版本的深度学习环境安装
本文记录了cuda、cuDNN的安装配置。 参考文章: cuda-installation-guide-microsoft-windows 12.1 documentation Installation Guide :: NVIDIA cuDNN Documentation 一、cuda安装 注意事项: 1、cuda安装最重要的是查看自己应该安装的版本。 表格…...
DoL-Lyra整合包完整使用指南:5分钟掌握汉化版Degrees of Lewdity一键安装
DoL-Lyra整合包完整使用指南:5分钟掌握汉化版Degrees of Lewdity一键安装 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS DoL-Lyra整合包为Degrees of Lewdity玩家提供了一站式解决方案&…...
企业级vGPU选型指南:从GRID vApps到vCS,4种NVIDIA虚拟GPU场景化对比
企业级虚拟GPU技术选型全景指南:四大应用场景深度解析 在数字化转型浪潮中,图形处理单元(GPU)的虚拟化技术正成为企业IT架构的关键支柱。无论是设计团队的3D建模、数据分析师的机器学习任务,还是全公司范围的虚拟桌面部署,虚拟GPU…...
从安装到跑通第一个旋转立方体:Ubuntu 22.04 + OpenGL完整开发环境搭建实录
从零到旋转立方体:Ubuntu 22.04下OpenGL开发环境实战指南 刚接触图形编程时,最令人兴奋的莫过于看到自己编写的代码在屏幕上"活"起来。本文将带你从零开始,在Ubuntu 22.04系统上搭建完整的OpenGL开发环境,并最终实现一个…...
ncmdumpGUI:突破网易云音乐NCM格式限制的高效解决方案
ncmdumpGUI:突破网易云音乐NCM格式限制的高效解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI ncmdumpGUI是一款开源的音频格式转换工具&am…...
ESP32嵌入式系统设计与实现指南
1. 项目概述1.1 系统架构本项目基于ESP32主控芯片设计,采用模块化架构实现多功能嵌入式系统。系统包含以下核心模块:主控单元:ESP32-WROOM-32D模组电源管理:TPS63020升降压转换器传感器接口:I2C/SPI多协议兼容设计人机…...
springboot基于协同过滤推荐算法的图书借阅推荐系统
目录需求分析与系统设计数据准备与处理协同过滤算法实现推荐系统集成系统测试与优化部署与监控项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与系统设计 明确系统的核心功能需求,包括用户管理、图书管理、…...
STM32F103测风扇转速,除了输入捕获,你还可以试试这个更省资源的“数脉冲”法
STM32F103风扇测速实战:输入捕获与数脉冲法的资源博弈 在嵌入式开发中,风扇转速监测是个看似简单却暗藏玄机的任务。面对STM32F103这类资源有限的Cortex-M3内核单片机,如何在保证功能的前提下最大化硬件利用率?传统输入捕获法虽精…...
Qwen3-ASR-1.7B部署案例:AI初创公司低成本构建ASR SaaS服务
Qwen3-ASR-1.7B部署案例:AI初创公司低成本构建ASR SaaS服务 想象一下,你是一家AI初创公司的技术负责人,老板给你下了个任务:两周内,为公司的新产品上线一个语音转文字(ASR)功能。要求是识别要准…...
Qwen3-0.6B-FP8入门必看:6亿参数如何做到≤2GB显存?FP8量化压缩深度解析
Qwen3-0.6B-FP8入门必看:6亿参数如何做到≤2GB显存?FP8量化压缩深度解析 你是不是也遇到过这种情况:想在自己的电脑上跑个大模型试试,结果一看显存要求,动辄十几GB,直接劝退?或者好不容易找到一…...
告别Makefile!用Zig 0.10.0自带的构建系统搞定ARM裸机开发(附完整项目配置)
用Zig构建系统重塑ARM裸机开发:告别Makefile的终极指南 当你在凌晨三点盯着第47个Makefile规则调试链接器错误时,是否想过——嵌入式开发必须这么痛苦吗?Zig 0.10.0带来的不仅是一门新语言,更是一套彻底革新裸机开发工作流的构建系…...
