C++ 实现【精准可控】内存占用测试工具(指定内存大小,实打实占用物理内存,亲测可用)

前言

在做程序性能验证、硬件资源测试、帧率影响实验(比如验证内存占用量对摄像头 / 图像处理 / 算法推理帧率的影响)时,我们经常需要人为、精准的占用指定大小的内存空间,以此模拟不同的内存负载环境。

Windows 自带的内存查看工具仅能观测内存使用情况,无法主动占用内存;专业的内存测试软件功能繁杂、附带多余进程易干扰实验数据,因此手写一个轻量级、无依赖、可精准指定内存占用大小的内存压力测试工具,是做实验验证、课程设计、性能测试的最优解。

本文分享的内存占用工具基于C++ 标准库开发,支持自定义内存占用大小(MB 为单位),可实打实占用计算机物理内存,而非虚拟内存,不会被系统优化释放,代码简洁无冗余、编译即可运行、无任何第三方依赖,Win10/Win11 完美兼容,常与 CPU 压力测试工具搭配使用,能完美完成「CPU + 内存对程序性能 / 帧率影响」的实验验证!

开发环境与依赖

  • 编译环境:VS2017/2019/2022(x86/x64 均可)、Dev-C++、Clion、Code::Blocks 等任意 C++ 编译器
  • 依赖库:C++ 标准库,无任何第三方依赖,无需配置 OpenCV/Boost/Qt 等库
  • 核心头文件:<iostream><vector><memory><cstring>均为 C++ 原生头文件,无需额外引入
  • 运行环境:Windows7/Windows10/Windows11 全版本兼容,32 位 / 64 位系统均可
  • 注意:32 位程序最大只能申请约 2GB 内存,64 位程序无内存申请上限(仅受计算机物理内存限制)

核心功能亮点

支持自定义内存占用大小,以 MB 为单位输入,想占用多少内存就设定多少,精准无误差 程序申请的是物理内存,通过写入数据规避系统虚拟内存优化,占用实打实,任务管理器精准显示 采用 C++ 智能指针管理内存,自动释放内存资源,无内存泄漏、无野指针问题,程序运行安全稳定 加入内存申请失败的异常捕获机制,内存不足时友好提示,程序不会崩溃卡死 轻量级程序,运行时无后台进程、无额外资源消耗,对其他实验程序零干扰 代码规范整洁、注释完整、逻辑清晰,新手也能轻松理解核心原理,可按需二次开发 无任何安装步骤,编译生成 exe 文件后双击即可运行,使用便捷

完整可运行源码(直接复制编译,无需修改)

cpp

运行

#include <iostream> #include <vector> #include <memory> #include <cstring> #include <stdexcept> using namespace std; int main() { size_t mb; cout << "=== 内存占用测试工具 ===" << endl; cout << "功能说明:精准占用指定大小的物理内存,不被系统优化释放" << endl; cout << "使用说明:输入需要占用的内存大小,单位为MB(例如 1024 = 1GB)" << endl; cout << "退出说明:占用内存后,按回车键即可释放内存并正常退出" << endl << endl; cout << "请输入要占用的内存大小 (MB): "; cin >> mb; // 计算需要申请的字节数 1MB = 1024*1024 Bytes size_t bytes = mb * 1024 * 1024; try { // 智能指针申请连续内存空间,自动管理内存,无需手动释放,杜绝内存泄漏 unique_ptr<char[]> buf(new char[bytes]); // 关键核心步骤:向申请的内存中写入数据 // 作用:让系统分配真实的物理内存,而非仅分配虚拟内存地址,避免系统优化导致内存未实际占用 cout << "正在占用内存中... (请勿关闭当前窗口)" << endl; memset(buf.get(), 0xFF, bytes); // 内存占用成功,提示信息 cout << "\033[32m 内存占用成功!已稳定占用 " << mb << " MB 物理内存\033[0m" << endl; cout << "提示:此时可打开任务管理器查看内存占用情况,数值精准匹配" << endl; cout << "按回车键释放内存并退出程序..." << endl; // 吸收输入缓冲区的换行符,避免程序直接退出 cin.ignore(); // 阻塞主线程,持续占用内存,等待用户回车触发释放 cin.get(); // 智能指针超出作用域时,自动调用delete[]释放内存,无需手动操作 } catch (const bad_alloc& e) { // 捕获内存申请失败异常,友好提示,程序优雅退出 cerr << "\033[31m 内存申请失败!错误原因:物理内存不足,无法分配 " << mb << " MB 内存\033[0m" << endl; return -1; } catch (const exception& e) { // 捕获其他未知异常,增强程序健壮性 cerr << "\033[31m 程序运行异常:" << e.what() << "\033[0m" << endl; return -1; } cout << endl << " 内存已全部释放,程序正常退出!" << endl; return 0; }

核心技术原理详解

1. 内存精准申请的核心逻辑

本程序的核心是申请指定大小的连续内存空间,内存大小的换算逻辑为:

plaintext

1MB = 1024 KB = 1024 * 1024 Bytes

用户输入需要占用的MB值,程序自动换算为对应的字节数,再通过指针申请对应大小的内存,做到「输入多少,占用多少」,无任何数值偏差,精准匹配用户需求。

2. 【重中之重】为什么要给申请的内存写入数据?

这是新手写内存占用程序必踩的核心坑点,也是内存能否被真实占用的关键:

  • Windows 系统为了节省物理内存资源,采用虚拟内存机制:当程序申请内存时,系统只会先分配「内存地址」,并不会立刻分配真实的物理内存,此时任务管理器中看到的内存占用并不会增加,这种内存称为「虚拟内存」。
  • 解决方案:通过memset(buf.get(), 0xFF, bytes)向申请的内存地址中写入数据(本程序写入 0xFF),系统检测到内存有数据写入时,会立刻为该内存地址分配真实的物理内存,此时任务管理器的内存占用数值会精准增加,且内存会被持续占用,不会被系统优化释放。
  • 核心函数:memset是 C 语言标准库函数,作用是将指定内存块的前 n 个字节设置为指定值,执行效率极高,不会额外消耗 CPU 资源。

3. 智能指针的安全内存管理(杜绝内存泄漏)

本程序采用 C++11 的std::unique_ptr智能指针管理内存,而非传统的原生指针char* buf = new char[bytes],优势极其明显:

cpp

运行

// 推荐写法:智能指针,自动释放内存 unique_ptr<char[]> buf(new char[bytes]); // 不推荐写法:原生指针,需手动释放,易造成内存泄漏 char* buf = new char[bytes]; // ... 业务逻辑 ... delete[] buf; // 忘记写则内存泄漏
  • 智能指针的特性:超出作用域自动释放内存,无需手动调用delete[],即使程序异常退出,也能保证内存被正常释放,从根源上杜绝内存泄漏问题。
  • unique_ptr是独占式智能指针,一个内存地址只能被一个智能指针管理,线程安全,无资源竞争问题,是内存管理的最优选择。

4. 异常捕获机制,让程序更健壮

程序中加入了完整的异常捕获逻辑,处理两种核心异常:

  1. bad_alloc异常:当申请的内存大小超过计算机剩余的物理内存时,内存申请失败,程序捕获异常并友好提示,不会崩溃卡死。
  2. 通用exception异常:捕获其他未知的运行时异常,增强程序的容错性和健壮性。

5. 输入缓冲区处理,避免程序闪退

程序中加入cin.ignore()吸收输入缓冲区的换行符,解决「输入内存大小后,程序直接跳过等待,闪退退出」的问题,保证程序运行逻辑符合预期:用户占用内存后,必须按下回车键才能释放内存并退出。

编译与运行说明(新手友好,一步到位)

编译方式

  1. 将完整源码复制到任意 C++ 编译器,新建.cpp文件粘贴代码即可;
  2. 直接编译,无需配置任何第三方库、无需链接额外依赖,编译过程无任何报错;
  3. 编译生成.exe可执行文件,双击即可运行,无需安装任何插件。

运行方式

  1. 双击运行编译后的 exe 程序,按照提示输入需要占用的内存大小(单位:MB);
    • 示例 1:输入1024→ 占用 1GB 物理内存
    • 示例 2:输入2048→ 占用 2GB 物理内存
    • 示例 3:输入4096→ 占用 4GB 物理内存
  2. 回车后程序开始占用内存,此时打开【任务管理器】→【性能】→【内存】,可清晰看到内存占用率和已用内存大小精准匹配设定值;
  3. 内存占用期间,程序窗口保持运行即可,内存会被持续占用;
  4. 实验完成后,按下【回车键】,程序自动释放所有占用的内存,内存资源回归系统,程序正常退出。

查看自身电脑物理内存大小

任务管理器 → 性能 → 内存 → 右上角可查看「已安装的内存 (RAM)」,这是计算机的总物理内存大小,建议申请的内存大小不超过总内存的 80%,避免系统卡顿。

常见问题与解决方案(避坑指南,全网最全)

Q1:程序运行后,任务管理器的内存占用没有变化?

A1:核心原因是只申请了虚拟内存,未写入数据导致系统未分配物理内存。本文的完整源码中已经加入memset写入数据的逻辑,直接使用源码即可解决该问题,这是内存占用程序的核心关键,缺一不可。

Q2:输入较大的内存值(如 8192=8GB),程序提示内存申请失败?

A2:正常现象!内存申请的上限是计算机的剩余物理内存大小,而非总内存大小。如果电脑已使用 4GB 内存,总内存为 16GB,那么最多只能申请约 12GB 内存;若申请的内存超过剩余内存,程序会捕获异常并提示,不会崩溃。

Q3:32 位编译的程序,申请超过 2GB 内存就提示失败?

A3:32 位程序的内存寻址空间最大为2GB,这是系统的硬件限制,无法突破。解决方案:将编译器的编译模式改为x64 (64 位),重新编译后即可申请任意大小的内存(仅受物理内存限制)。

Q4:程序退出后,内存占用没有恢复?

A4:不用担心!本程序使用智能指针管理内存,程序退出时会自动释放所有内存;任务管理器的内存数据刷新有延迟,等待 1~2 秒后查看,内存占用会自动恢复到占用前的数值,无任何内存残留。

Q5:运行程序时,输入内存大小后程序直接闪退?

A5:输入缓冲区的换行符导致的问题,本文源码中已经加入cin.ignore()处理该问题,直接使用完整源码即可避免,无需额外修改。

最佳应用场景(黄金搭配,实验必备)

本内存占用工具是为实验验证量身打造的,实用性极强,尤其是和 CPU 压力测试工具搭配使用,能完成绝大多数性能验证实验,推荐核心应用场景:

场景 1:验证内存占用量对程序帧率的影响

搭配摄像头监控 / FPS 计算程序使用:固定 CPU 占用率不变,通过本工具依次申请 2GB、4GB、8GB 内存,记录不同内存负载下的程序帧率,完美验证「内存占用量对帧率的影响规律」(结论:内存充足时帧率无变化,内存不足时帧率骤降)。

场景 2:CPU + 内存 双负载综合性能测试

和 CPU 压力测试工具一起运行:一边设定 CPU 占用 80%+4 核,一边申请 8GB 内存,模拟高负载的真实运行环境,测试程序在极限环境下的稳定性和运行效率,这是最贴近真实场景的性能测试方式。

场景 3:课程设计 / 实验报告 / 毕业设计

本程序代码简洁、逻辑清晰、注释完整,无冗余代码,可直接作为课程设计的源码,搭配实验报告使用;核心原理易懂,讲解方便,能体现对 C++ 内存管理、系统内存机制的理解,加分项满满。

场景 4:内存泄漏检测辅助工具

在开发大型程序时,可使用本工具占用部分内存,模拟内存紧张的环境,更容易检测出程序中的内存泄漏、内存溢出等问题。

总结

本文分享的内存占用测试工具,是一款轻量级、高精度、高安全性、无依赖的实用工具,完美解决了 Windows 下「精准占用指定大小物理内存」的需求。程序的核心原理不仅能帮助我们完成实验验证,还能深入理解 C++ 的内存管理机制、Windows 的虚拟内存原理,是理论与实践结合的绝佳案例。

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

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

相关文章

typescript-类的静态属性和静态方法

我们上一节看到了类&#xff0c;里面都是类的实例属性和实例方法&#xff0c;即需要实例化后才可以进行访问的。什么是静态属性和静态方法&#xff1f;静态属性和静态方法是不需要实例化就可以访问的属性和方法(不需要实例化是指不需要new来生成对象)。还是以上一节的Person类举…

解锁AI记忆新范式:人类情景记忆如何提升大模型性能

本文探讨了如何借鉴人类情景记忆机制改进记忆增强型大语言模型。当前AI记忆系统在数据使用上低效且不符合人类认知直觉。文章对比了LLM与人脑记忆系统的五大关键差异&#xff1a;动态更新、事件分割、选择性、时间连续性和检索竞争。通过引入类人记忆机制&#xff0c;不仅能让A…

人工智能应用-机器视觉:绘画大师 05.还原毕加索的隐藏画

在艺术史上&#xff0c;一些大画家也曾经历过艰难时刻。例如&#xff0c;毕加索在 1901—1904 年间经历了极度的经济困境。 为了节省开支&#xff0c;他不得不在已经使用过的画布上创作新作品。如图 26.7所示&#xff0c;通过 X 射线扫描&#xff0c;人们发现毕加索在这一时期…

揭秘!提示工程架构师优化提示系统用户参与策略的关键技巧

揭秘&#xff01;提示工程架构师优化提示系统用户参与策略的关键技巧 一、引言&#xff1a;为什么你精心设计的AI系统&#xff0c;用户只用了一次&#xff1f; 上周&#xff0c;我朋友小A的吐槽让我印象深刻——他花了一个月搭建的AI旅游助手&#xff0c;上线3天用户留存率只…

【教程4>第10章>第25节】基于FPGA的图像Robert变换开发——理论分析与matlab仿真

目录 1.软件版本 2.图像Robert变换理论概述 3.图像Robert变换提取的matlab仿真测试 欢迎订阅FPGA/MATLAB/Simulink系列教程 《★教程1:matlab入门100例》 《★教程2:fpga入门100例》 《★教程3:simulink入门60例》 《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》

学霸同款2026继续教育AI论文平台TOP10:毕业论文写作全测评

学霸同款2026继续教育AI论文平台TOP10&#xff1a;毕业论文写作全测评 2026继续教育AI论文平台测评&#xff1a;选对工具&#xff0c;提升写作效率 在当前学术环境日益严格的背景下&#xff0c;继续教育群体在撰写毕业论文时面临诸多挑战&#xff0c;如选题困难、文献检索繁琐、…

AAAI 2025论文分享|Agent4Edu:基于大语言模型生成式智能体的个性化学习模拟器

本推文介绍了AAAI 2025收录的一篇论文《Agent4Edu: Generating Learner Response Data by Generative Agents for Intelligent Education Systems》。Agent4Edu是一种基于大语言模型的个性化学习模拟器&#xff0c;旨在解决智能教育系统中高质量学习者响应数据稀缺、传统模拟方…

空气能十大领军品牌盘点:绿色能源时代的创新力量 - 资讯焦点

在“双碳”目标全面推进和清洁能源转型的浪潮中,空气能行业正迎来前所未有的发展机遇。作为高效、环保、可再生的能源利用方式,空气能技术已在采暖、制冷、热水等多个领域展现出强大的竞争力和市场潜力。本文盘点当前…

2025 AI大模型薪资狂欢:小白程序员入行最后黄金时机,年薪百万不是梦!非常详细建议收藏

文章分析了2025年AI大模型领域高薪就业趋势&#xff0c;指出供需失衡和政策支持导致AI岗位薪资暴涨&#xff0c;大模型算法工程师平均月薪7万。文章介绍五大高薪岗位及所需技能&#xff0c;提供提升竞争力的方法&#xff0c;并强调技术红利窗口期正在关闭&#xff0c;现在是入行…

Node.js代码统计神器

统计代码行数使用Node.js编写一个脚本&#xff0c;统计指定目录下所有文件的代码行数。const fs require(fs); const path require(path);function countLinesInFile(filePath) {const content fs.readFileSync(filePath, utf-8);return content.split(\n).length; }functio…

大数据毕设选题推荐:基于django的菜价可视化系统蔬菜销售分析与预测可视化系统【附源码、mysql、文档、调试+代码讲解+全bao等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

存储技术全解:从基础到前沿

系统存储机制深度剖析技术文章大纲存储基础概念存储介质的分类&#xff08;HDD、SSD、NVMe、NVM&#xff09;存储层次结构&#xff08;寄存器、缓存、主存、外存&#xff09;数据存取的基本原理&#xff08;寻址、读写、延迟&#xff09;文件系统与存储管理文件系统的核心组件&…

基于广义Benders分解法的综合能源系统优化规划Matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿真咨询内容私信。&#x1f447; 关注我…

基于多目标粒子群算法冷热电联供综合能源系统运行优化Matlab实现

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿真咨询内容私信。&#x1f447; 关注我…

洛谷 P10962:Computer ← 换根DP

​【题目来源】https://www.luogu.com.cn/problem/P10962http://acm.hdu.edu.cn/showproblem.php?pid=2196【题目描述】某学校在一段时间前购买了第一台计算机(因此这台计算机的编号是 1)。在最近几年中,学校又购买…

activiti7的强制绑定角色问题

角色强绑定问题及解决方案 在使用若依的基础上,本打算将activiti7集成进去,结果在测试调用activiti的api时返回前端"没有权限,请联系管理员授权" 本来还以为是若依的权限校验,结果通过debug发现日志中报…

SCADA与数字孪生(Digital Twin)系统的异同点在哪里?

SCADA&#xff08;Supervisory Control and Data Acquisition&#xff0c;监控与数据采集系统&#xff09;和数字孪生&#xff08;Digital Twin&#xff09;系统都是工业自动化、智能制造和基础设施管理中的关键技术&#xff0c;但它们在目标、功能、技术架构和应用场景上存在显…

AI狂飙与冷思考:一个准码农的2026开年观察

AI狂飙与冷思考:一个准码农的2026开年观察* { margin: 0; padding: 0; box-sizing: border-box } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue&quo…

完整教程:人机交互(如 VR 手柄追踪、光标移动、手势识别)的滤波算法

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

生成式软件制造--AI驱动的软件开发 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …