首页 > 后端开发 > C++ > 正文

C++怎么实现一个简单的内存分析器(Profiler)_C++性能分析与内存Profiler实现

冰火之心
发布: 2025-11-10 21:13:02
原创
657人浏览过
答案:通过重载new和delete操作符,结合内存记录、调用堆栈追踪、泄漏报告及线程安全机制,实现轻量级C++内存分析器。

c++怎么实现一个简单的内存分析器(profiler)_c++性能分析与内存profiler实现

要实现一个简单的 C++ 内存分析器(Memory Profiler),核心思路是拦截程序中的内存分配与释放操作,记录每次分配的大小、调用位置、时间戳等信息,并在程序结束时输出统计结果。通过重载 newdelete 操作符,我们可以轻松捕获所有动态内存操作。

1. 重载 new 和 delete 操作符

C++ 允许全局重载 newdelete,这样就能监控所有通过它们进行的内存操作。我们可以在其中插入日志、计数或堆追踪。

示例代码:

立即学习C++免费学习笔记(深入)”;

#include <iostream>
#include <map>
#include <cstdlib>
<p>// 记录分配地址与大小
std::map<void*, size_t> allocation_map;
size_t total_allocated = 0;</p><p>void<em> operator new(size_t size) {
void</em> ptr = std::malloc(size);
if (ptr) {
allocation_map[ptr] = size;
total_allocated += size;
std::cout << "[ALLOC] " << ptr << " size=" << size 
<< " total=" << total_allocated << "\n";
}
return ptr;
}</p><p>void operator delete(void* ptr) noexcept {
if (ptr == nullptr) return;
auto it = allocation_map.find(ptr);
if (it != allocation_map.end()) {
total_allocated -= it->second;
std::cout << "[FREE ] " << ptr << " size=" << it->second 
<< " total=" << total_allocated << "\n";
allocation_map.erase(it);
}
std::free(ptr);
}
登录后复制

2. 添加调用堆栈追踪(可选)

为了定位内存泄漏源头,可以加入调用堆栈信息。Linux 下可用 backtrace()backtrace_symbols()

修改后的 new 示例:

存了个图
存了个图

视频图片解析/字幕/剪辑,视频高清保存/图片源图提取

存了个图 17
查看详情 存了个图
#include <execinfo.h>
<p>void<em> operator new(size_t size) {
void</em> ptr = std::malloc(size);
if (ptr) {
allocation_map[ptr] = size;
total_allocated += size;</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">    void* call_stack[10];
    int depth = backtrace(call_stack, 10);
    char** symbols = backtrace_symbols(call_stack, depth);

    std::cout << "[ALLOC] " << ptr << " size=" << size << "\n";
    for (int i = 0; i < depth; ++i) {
        std::cout << "  " << symbols[i] << "\n";
    }
    free(symbols);
}
return ptr;
登录后复制

}

编译时需加 -g -rdynamic 参数以保留符号信息。

3. 统计与报告生成

在程序退出时打印未释放的内存块,帮助发现泄漏。

使用 atexit() 注册清理函数:

void report_leaks() {
    std::cout << "\n=== Memory Leak Report ===\n";
    if (allocation_map.empty()) {
        std::cout << "No leaks detected.\n";
    } else {
        for (const auto& pair : allocation_map) {
            std::cout << "[LEAK] " << pair.first 
                       << " size=" << pair.second << "\n";
        }
        std::cout << "Total leaked: " << allocation_map.size() 
                   << " blocks, " << total_allocated << " bytes.\n";
    }
}
<p>// 在 main 中注册
int main() {
atexit(report_leaks);
// ... your code
}
登录后复制

4. 线程安全考虑

多线程环境下,allocation_maptotal_allocated 需要加锁保护。

使用 std::mutex 保证线程安全:

#include <mutex>
std::mutex alloc_mutex;
<p>void* operator new(size_t size) {
std::lock_guard<std::mutex> lock(alloc_mutex);
// ... 同上
}</p><p>void operator delete(void* ptr) noexcept {
std::lock_guard<std::mutex> lock(alloc_mutex);
// ... 同上
}
登录后复制

基本上就这些。这个简易内存 Profiler 能帮你捕捉分配/释放行为、检测泄漏、统计总量。虽然不如 Valgrind 或 AddressSanitizer 强大,但胜在轻量、可定制,适合嵌入开发流程中做初步排查。

以上就是C++怎么实现一个简单的内存分析器(Profiler)_C++性能分析与内存Profiler实现的详细内容,更多请关注php中文网其它相关文章!

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号