尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

记录一个标记所有new出来的内存的地址加上TAG

记录一个标记所有new出来的内存的地址加上TAG
📅 发布时间:2026/7/2 2:34:21
#pragma once #include <iostream> #include <cstring> #include <cstdlib> #include <new> #include <typeinfo> // 可选,如果不想用宏自动传名可以结合 typeid // 只在调试模式下启用 #ifdef _DEBUG struct MemHeader { char className[128]; // 存储类名 size_t size; // 用户请求的字节数 // 可以添加:file, line, timestamp 等 }; // 带类名参数的 operator new inline void* operator new(size_t sz, const char* name) { size_t total = sizeof(MemHeader) + sz; void* raw = malloc(total); if (!raw) throw std::bad_alloc(); MemHeader* h = static_cast<MemHeader*>(raw); // 安全复制类名,截断超过 127 个字符 strncpy(h->className, name, sizeof(h->className) - 1); h->className[sizeof(h->className) - 1] = '\0'; h->size = sz; // 返回用户区域指针(头部之后) return static_cast<char*>(raw) + sizeof(MemHeader); } // 对应的 operator delete(释放时回退头部) inline void operator delete(void* p) noexcept { if (!p) return; void* raw = static_cast<char*>(p) - sizeof(MemHeader); free(raw); } // 为了安全,也重载 placement delete(如果构造函数抛出异常会调用) inline void operator delete(void* p, const char*) noexcept { ::operator delete(p); } // --- 宏定义(自动传入类名)--- // 用法:NEW(MyClass) → 调用默认构造 // NEW(MyClass, arg1) → 调用带参构造 #define NEW(T, ...) new (#T) T(__VA_ARGS__) #else // 非调试模式,直接使用标准 new #define NEW(T, ...) new T(__VA_ARGS__) #endif

main.cpp

#include "debug_new.h" #include <iostream> #include <unistd.h> class MyClass { public: MyClass() { std::cout << "MyClass default constructed" << std::endl; } MyClass(int x) { std::cout << "MyClass constructed with " << x << std::endl; } ~MyClass() { std::cout << "MyClass destroyed" << std::endl; } }; class Another { int a; public: Another(int a, double b) : a(a) { std::cout << "Another(" << a << ", " << b << ")" << std::endl; } }; int main() { // 使用 NEW 宏,自动传入类名 MyClass* obj1 = NEW(MyClass); MyClass* obj2 = NEW(MyClass, 42); Another* obj3 = NEW(Another, 10, 3.14); while(1) sleep(1); delete obj1; delete obj2; delete obj3; return 0; }

armg++ -D_DEBUG -g -o myapp main.cpp -std=c++11

Breakpoint 2, MyClass::MyClass (this=0x424ca8) at main.cpp:7 7 in main.cpp (gdb) bt #0 MyClass::MyClass (this=0x424ca8) at main.cpp:7 #1 0x0000000000400e4c in main () at main.cpp:20

dump

(gdb) p (char*)0x424ca8 - 136 $2 = 0x424c20 "MyClass" (gdb) dump memory /data/pub/d.bin 0x424ca8 0x445000 (gdb) dump memory /data/pub/d.bin 0x424ca8-136 0x445000
root@hovfree:/data/pub# hexdump -C d.bin 00000000 4d 79 43 6c 61 73 73 00 00 00 00 00 00 00 00 00 |MyClass.........| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| *

相关新闻

  • 汽车电子散热管理:DRV8213驱动器与MF25060V2风扇实战
  • 封装统一多模态客户端(整合文字对话 + 文生图 + 语音转写)
  • React 渲染性能:组件边界、状态下沉与重渲染治理

最新新闻

  • 市面上有实力的海泡石工厂有哪些
  • 企业级 AI Agent 本地化部署实战:从环境搭建到上线全流程
  • 广州小程序开发实力榜前十:2026年谁更适合不同项目路线
  • 卡帕塞替尼所致皮肤不良反应(斑丘疹/瘙痒):发生率、识别与全程护理要点
  • 电压暂降治理设备怎么选?DVR、UPS、APF、SVG功能对比
  • 国家中小学智慧教育平台电子课本下载完整教程:三步获取PDF教材的终极方案

日新闻

  • Python Playwright录制功能:从零到一构建自动化测试脚本
  • 如何用开源工具永久保存你心爱的小说:novel-downloader全攻略
  • In-Context Learning不是教知识,而是模式对齐:从5个示例到100个工业级样本的真相

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号