通过重载new/delete并记录分配信息,可实现内存泄漏检测,在程序结束时报告未释放内存块。

在C++开发中,内存泄漏是常见问题。通过重载全局的new和delete操作符,我们可以实现一个简单的内存泄漏检测工具,记录每次内存分配与释放的信息,并在程序结束时报告未释放的内存块。
要实现内存检测,我们需要替换默认的new和delete行为,在分配和释放内存时插入日志记录逻辑。
以下是一个基本实现:
// MemoryTracker.h
#include <iostream>
#include <map>
#include <string>
<p>struct AllocInfo {
size_t size;
const char* file;
int line;
};</p><p>// 全局映射表,记录当前未释放的内存
extern std::map<void*, AllocInfo> g_allocations;</p><p>// 重载 new 操作符
void<em> operator new(size_t size, const char</em> file, int line);
void<em> operator new[](size_t size, const char</em> file, int line);</p><p>// 普通 new 的重载(无文件行号)
void<em> operator new(size_t size);
void</em> operator new[](size_t size);</p><p>// 重载 delete 操作符
void operator delete(void<em> ptr) noexcept;
void operator delete[](void</em> ptr) noexcept;</p><p>// 打印内存泄漏报告
void printMemoryLeaks();</p>// MemoryTracker.cpp
#include "MemoryTracker.h"
#include <iostream>
<p>std::map<void*, AllocInfo> g_allocations;</p><p>void<em> operator new(size_t size, const char</em> file, int line) {
void* ptr = mallo
c(size ? size : 1); // 防止 new(0)
if (ptr) {
g_allocations[ptr] = {size, file, line};
}
return ptr;
}</p><p>void<em> operator new[](size_t size, const char</em> file, int line) {
return operator new(size, file, line);
}</p><p>void* operator new(size_t size) {
return operator new(size, "unknown", 0);
}</p><p>void* operator new[](size_t size) {
return operator new[](size, "unknown", 0);
}</p><p>void operator delete(void* ptr) noexcept {
if (ptr == nullptr) return;
auto it = g_allocations.find(ptr);
if (it != g_allocations.end()) {
g_allocations.erase(it);
}
free(ptr);
}</p><p>void operator delete[](void* ptr) noexcept {
operator delete(ptr);
}</p><p>void printMemoryLeaks() {
if (g_allocations.empty()) {
std::cout << "No memory leaks detected.\n";
} else {
std::cout << "Memory leaks detected:\n";
for (const auto& pair : g_allocations) {
std::cout << "Address: " << pair.first
<< " Size: " << pair.second.size
<< " File: " << pair.second.file
<< " Line: " << pair.second.line << "\n";
}
}
}</p>为了自动传入文件名和行号,我们可以定义宏来替换new关键字。
在项目中包含头文件后,添加如下宏定义:
#define new new(__FILE__, __LINE__)
这样所有使用new的地方都会携带位置信息。注意:这个宏会影响整个翻译单元,建议只在需要检测的源文件中局部启用。
美图云修
商业级AI影像处理工具
50
查看详情
下面是一个测试例子:
#include "MemoryTracker.h"
<p>// 启用带位置信息的 new</p><h1>define new new(<strong>FILE</strong>, <strong>LINE</strong>)</h1><p>int main() {
int<em> p1 = new int(42);
int</em> p2 = new int[10];</p><pre class='brush:php;toolbar:false;'>delete[] p2; // 正确释放
// delete p1; // 故意遗漏,制造泄漏
printMemoryLeaks(); // 程序退出前调用
return 0;}
运行结果会显示类似:
Memory leaks detected: Address: 0x7fb1c8c00000 Size: 4 File: main.cpp Line: 7
这种简单检测工具有几个要点需要注意:
printMemoryLeaks()在程序退出前被调用,最好放在main函数末尾或使用atexit()注册#define new可能影响标准库或其他第三方代码,应谨慎使用范围g_allocations
基本上就这些。这个轻量级方案适合学习和小型项目。对于生产环境,推荐使用Valgrind、AddressSanitizer等专业工具。不过自己动手实现一遍,有助于深入理解C++内存管理机制。
以上就是C++怎么实现一个简单的内存泄漏检测工具_C++重载new和delete操作符的详细内容,更多请关注其它相关文章!
# 多线程
# 西北关键词排名有必要吗
# 酒业产品营销推广方案
# 牙膏的营销推广
# 绥德抖音seo优化
# 立金哥seo
# 株洲全网网络推广seo
# seo蜘蛛推广
# 巴彦淖尔商机网站建设
# 游泳馆营销推广措施
# 洪梅网络营销推广价格
# 句柄
# 放在
# 有什么区别
# 结束时
# 工具
# 是一个
# 如何实现
# 如何使用
# 美图
# 行号
# 标准库
# c++开发
# 常见问题
# stream
# ios
# c++
# ai
# 栈
相关文章:
铃兰之剑为这和平的世界希里技能组及加点推荐
qq游戏大厅官方下载_qq游戏免费下载安装入口
不同用户不同价格! 索尼开启账户个性化定价测试
AO3最新镜像入口 Archive of Our Own官方平台访问
AO3官方可用镜像 Archive of Our Own网页版最新入口
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
Lar*el Excel导入时生成自定义递增ID的策略与实践
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
圆通快递查询实时追踪 圆通物流包裹状态快速查看
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
C++如何实现线程池_C++11手动实现一个简单的固定大小线程池
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
解决J*aScript中重复选择项的确认对话框显示问题
在Runstone环境中高效处理TasteDive API的JSON数据
如何在 Windows 11 中启动游戏手柄设置
实现全屏滚动与导航点:专业教程
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
Go语言中动态执行代码字符串的策略与实践
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
J*aScript教程:根据元素文本内容动态设置背景色
Python实时数据流中的动态最值查找策略
《主播少女的秘密账号迷宫》首支宣传片
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
Go语言中高效处理x-www-form-urlencoded表单数据
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略
微信群消息显示延迟如何解决 微信群消息刷新优化方法
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
德邦快递查询平台 德邦快递物流信息查询入口
Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
新手怎么开始学化妆 零基础化妆入门教程
Python大型XML文件高效流式解析教程
可靠CSGO开箱平台解析 CSGO开箱网合集
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
J*aScript数组对象转换:按指定键分组与值收集
*请认真填写需求信息,我们会在24小时内与您取得联系。