C++ 内存追踪器

main.c

复制代码
#include "pch.h"

struct Object
{
    int x,y,z;
};

int main()
{
    Print_MemoryUsage("strat");
    {
//        const char* string = "Cherno Cherno Cherno Cherno"; // 栈分配
        std::string string = "Cherno Cherno Cherno Cherno";  // >=15字节,堆分配
        Print_MemoryUsage("after string");
        {
            Object* obj = new Object();
//            std::unique_ptr<Object> obj = std::make_unique<Object>(); //自动 delete
            Print_MemoryUsage("after new");
            delete obj;
        }
        Print_MemoryUsage("after delete");
    }
    Print_MemoryUsage("end");
    

    std::cin.get();
}

pch.h

复制代码
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <fstream>
#include <sstream>
#include <thread>
#include <mutex>
#include <chrono>
#include <functional>
#include <algorithm>
#include <csignal>

// 内存追踪器
struct AllocationMetrics
{
    uint32_t TotalAllocated = 0;
    uint32_t TotalFreed = 0;

    uint32_t CurrentUsage()
    {
        return TotalAllocated - TotalFreed;
    }
};

static AllocationMetrics s_AllocationMetrics;

// 重载的内存分配函数
void *operator new(size_t size)
{
    s_AllocationMetrics.TotalAllocated += size;

    std::cout << "Allocating " << size << " bytes\n";
    return malloc(size);  // 实际分配
}

// 重载数组版的 new[]
void* operator new[](size_t size)
{
    s_AllocationMetrics.TotalAllocated += size;
    std::cout << "Allocating (array) " << size << " bytes\n";
    return malloc(size);
}

void operator delete(void* memory,size_t size)
{
    s_AllocationMetrics.TotalFreed += size;
    std::cout << "Freeing " << size << " bytes\n";
    free(memory);
}

// 重载数组版的 delete[] (带 size 参数)
void operator delete[](void* memory,size_t size) noexcept
{
    s_AllocationMetrics.TotalFreed += size;
    std::cout << "Freeing " << size << " bytes\n";
    free(memory);
}

// 无参数的后备版本
void operator delete(void* memory) noexcept
{
    free(memory);
}

// 重载数组版的 delete[] (无 size 参数,作为后备)
void operator delete[](void* memory) noexcept
{
    std::cout << "Freeing (unknown size)\n";
    // 这里依然无法追踪 size,但作为安全兜底
    free(memory);
}

// 工具函数
static void Print_MemoryUsage(const char* msg)
{
    std::cout << "Memory [" << msg << "]: " \
    << s_AllocationMetrics.CurrentUsage() << std::endl;
}
相关推荐
啵啵鱼爱吃小猫咪2 小时前
Ubuntu 20.04 + ROS Noetic 源码安装 libfranka 0.8.0 和 franka_ros 0.8.0 完整教程
linux·运维·ubuntu
ljs6482739513 小时前
Linux运维实操:vi编辑器永久配置静态IP(CentOS系列)
linux·运维·编辑器
dddwjzx3 小时前
嵌入式Linux C应用编程入门——高级I/O
linux·嵌入式
Waay5 小时前
Linux 三个核心环境变量配置文件、作用域、生效方式完整梳理
linux·运维·学习·云原生·容器
星空语5 小时前
音频001_Android+Linux车载/手机音频全链路分层架构图
android·linux·音视频
携程DBA5 小时前
数据库软限制相关研究
linux·mysql·性能
huy1n95 小时前
Ubuntu 22.04部署Claude Code并接入DeepSeek-V4模型完整教程
linux·ubuntu·deepseek·claude code
jieyucx5 小时前
Shell实战:无限循环监控Nginx服务,异常自动重启+双份日志留存
linux·运维·nginx·自动化·shell
KuaCpp5 小时前
C++进程(下)
c++