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;
}
相关推荐
雪落漂泊1 分钟前
Linux基础开发工具(三)gcc/g++与make/makefile篇
linux·运维·服务器
夏虫不可与之言冰2 分钟前
第三课 点亮 LED 与定时器非阻塞闪烁
c语言·c++·vscode·单片机·嵌入式硬件·物联网
爱吃辣椒的小豆豆10 分钟前
Linux-sshd-实战-白名单与跳板机
linux·运维·服务器
辛苦才能15 分钟前
C++ 哈希表深度解析:删除为什么必须打标记,负载因子为什么卡 0.7
开发语言·数据结构·c++·算法
气质、小青年!15 分钟前
进程1学习
linux·学习
miller-tsunami26 分钟前
STL简介&string相关知识点
开发语言·c++·string
blueSatchel35 分钟前
framebuffer注册源码解读
linux·嵌入式
2401_8628808244 分钟前
嵌入式Linux系统移植与驱动开发完整指南
linux·c语言·驱动开发
坤坤子吖1 小时前
Linux 线程同步与互斥——互斥锁
linux·服务器·c++·笔记·学习
TDTC_XQ1 小时前
Linux网络编程accept的讲解
linux·服务器·c++