C++极简内存泄露检测工具(34行代码实现)

news2025/1/20 0:48:13

工具特点

1 极度简单:34行代码实现,线程安全

2 入寝式检测:需要给现有重点怀疑的类添加一行入寝代码

3 只针对类类型:动态数组需要使用更为复杂的技术,不在检测能力范围之内。考虑到大部分C++代码都以类实现代码,所以我认为这已经足够。

4 仅限于测试:不可以用于正式代码。当我们发现有可能有内存泄露的时候,使用该工具入侵到当前代码。跑一段时间发现有没有内存泄露。发现泄露之后需要再次删除入侵代码。

实现原理

给类添加一个静态成员,这个成员在类对象复制控制的时候记录该对象创建(构造)了多少次,释放(析构)了多少次。

在程序退出时向控制台输出统计结果。

代码非常易于理解。

一些特殊的场景

1 服务端程序:服务端程序往往长时间运行不退出。但是我们的工具只有程序正确的退出才会给出统计结果。所以,你的服务端程序必须要能够(改造成)正常退出(可以使用Web接口,捕获信号,接受输入等方式)。

2 动态数组检测:如果历史代码里有大量的动态数组,使用原始指针来访问管理。那么这种情况下,该工具爱莫能助。我们认为这样的C++代码首先是不合理的。所以也不予支持。

程序效果

1 可靠:由于代码过于简单,所以库本身不会有问题。经历过多个产品的内存泄露检测工作。完美可信赖。

2 好用:只需要包含一个头文件即可。

具体实现

代码下载

1 Gitee

CalmReason/cxx_memory_leak_check

2 百度云

链接:https://pan.baidu.com/s/1x4d2K4ZdoS9XdJrzyb311A

提取码:1234

源代码

memory_leak_checker.hpp

只需要把这个头文件包含到你的工程里就可以使用:

#ifndef MEMORY_LEAK_CHECKER_H
#define MEMORY_LEAK_CHECKER_H

//memory checke library begin
#include <assert.h>
#include <iostream>
#include <atomic>
#include <string>
class object_usage_counter {
public:
    object_usage_counter(const char* name) :m_name(name), m_counter(0) {};
    ~object_usage_counter() { std::cout << "class " << m_name << " memory leak num = " << m_counter << std::endl; };
    void inc() { ++m_counter; }
    void dec() { --m_counter;	assert(m_counter >= 0); }
private:
    std::atomic<long long> m_counter;
    std::string m_name;
};
template<typename T>
class counter_by_copy {
public:
    counter_by_copy() { m_the_only_object_for_one_class.inc(); }
    ~counter_by_copy() { m_the_only_object_for_one_class.dec(); }
    counter_by_copy(const counter_by_copy&) { m_the_only_object_for_one_class.inc(); }
private:
    //the only object to count usage.
    static object_usage_counter m_the_only_object_for_one_class;
};
//TIPS:template class's static member object can be define at the .h file
template<typename T>
object_usage_counter counter_by_copy<T>::m_the_only_object_for_one_class(typeid(T).name());
//memory checke library end

#endif // !MEMORY_LEAK_CHECKER_H


//example usage
/*
class A
{
public:
    //A's copy control member functions call counter increasing or decreasing usage.
    counter_by_copy<A> m_checker;
};
*/

测试程序 test_main.cpp

#include "memory_leak_checker.hpp"
#include <memory>
#include <vector>
#include <thread>
#include <future>

class A
{
public:
	counter_by_copy<A> m_checker;
};

A* CreateA(void)
{
	return new A;
}

void f(void)
{
	auto p = new A;
	//do some thing

	//这里泄漏了一次
}

int main(int argc, char* argv[])
{
	auto pa = new A;//leak 1
	new A[5];//leak 5

	auto p2 = CreateA();
	delete p2;

	f();//leak 1

	auto listA = std::vector<std::shared_ptr<A>>(5, std::make_shared<A>());//no leak
	for (int i = 0; i < 3; ++i)
	{
		listA.push_back(std::make_shared<A>());//no leak
	}
	std::cout << "test leack 7" << std::endl;
}

运行输出

test leack 7

class 1A memory leak num = 7

CMake工程文件 CMakeLists.txt

如果你需要跑测试用例,可以用这个CMakeLists.txt文件,也可以自己拷贝代码自己创建工程使用。

cmake_minimum_required(VERSION 3.3)
project(memory_leak_check)
add_executable(main test_main.cpp)

竞品分析

1 VS自带的Debug Report

我用过VS自带内存泄露诊断工具Debug。这个工具有些场景是发现不了的。过于简单。

而且只能用VS调试环境运行。无法在Release环境运行。

2 Valgrind

这个工具做的事情太多了,太复杂了。什么场景都想把控。结果就是乱七八糟给你一堆报告,有没有泄露你也不敢信。报告内容太多,多的你都不知道到底泄露了没有。

关键是你不知道它靠不靠谱。

3 对比分析

当前工具主打一个简单,主打一个可控,主打一个准确无误。

keep it stupid simple !

以上。

最后

如果有任何问题,欢迎随时与我交流。

可以留言或者私信交流。

祝你工作顺利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python零基础超详细教程:字典(Dictionary)相关介绍使用

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! Python字典是另一种可变容器模型&#xff0c; 且可存储任意类型对象&#xff0c;如字符串、数字、元组等其他容器模型。 python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、创建字典 字典由键和对应值…

高数刷题笔记

任取一米奚落>0,存在德尔塔...&#xff0c;0<|x-x0|<德尔塔 不同点是这个不是|x-x0|趋近与哪一个小范围&#xff0c;而是x趋近与大范围 极限的本质就是逼近&#xff0c;二者都是在确定要逼近到什么程度&#xff01;&#xff01;&#xff01; 放缩 我们要凑出|x-x0|的…

python技术面试题合集(二)

python技术面试题 1、简述django FBV和CBV FBV是基于函数编程&#xff0c;CBV是基于类编程&#xff0c;本质上也是FBV编程&#xff0c;在Djanog中使用CBV&#xff0c;则需要继承View类&#xff0c;在路由中指定as_view函数&#xff0c;返回的还是一个函数 在DRF中的使用的就是…

docker笔记3 Docker常规安装

1.安装tomcat docker hub上面查找tomcat镜像 docker search tomcat 从docker hub上拉取tomcat镜像到本地 docker pull tomcat docker images查看是否有拉取到的tomcat 使用tomcat镜像创建容器实例(也叫运行镜像) docker run -it -p 8080:8080 tomcat -p 小写&#xff0c;主…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书杭州师范大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书杭州师范大学图书馆

MySQL访问和配置

目录 1.使用MySQL自带的客户端工具访问 2.使用DOS访问(命令行窗口WinR → cmd) 3.连接工具&#xff08;SQLyog或其它&#xff09; MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 1.使用MySQL自…

AMEYA360代理 | 佰维eMMC、LPDDR存储芯片赋能电视终端流畅体验

5G、AI、VR、AR等技术的发展&#xff0c;助推智能电视、机顶盒等电视终端成为智能家居领域不可忽视的重要设备。随着4K超高清(UHD)技术、虚拟现实技术(VR)和增强现实技术(AR)的普及&#xff0c;并向8K超高清技术不断渗透&#xff0c;电视终端将可以为消费者提供更清晰的视觉体验…

解决DCNv2不能使用高版本pytorch编译的问题

可变形卷积网络GitHub - CharlesShang/DCNv2: Deformable Convolutional Networks v2 with Pytorch代码已经出来好几年了&#xff0c;虽然声称"Now the master branch is for pytorch 1.x"&#xff0c;实际上由于pytorch自1.11版开始发生了很大变化&#xff0c;原来基…

时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测

时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测&#xff1b; 2.运行环…

精益创业的规划框架:愿景,战略,产品

精益创业的规划框架&#xff1a;愿景&#xff0c;战略&#xff0c;产品【安志强趣讲276期】 趣讲大白话&#xff1a;愿景管战略&#xff0c;战略管产品 **************************** 愿景&#xff1a;创业企业有个清晰的方向 愿景怎么来的&#xff1f;发现社会问题&#xff0c…

electron笔记无边框窗口、DLL调用、DLL函数返回指针

无边框 const win new BrowserWindow({width: 1290,height: 736,minHeight: 736,minWidth: 1040,maxHeight: 736,maxWidth: 1290,frame: false, // 无边框webPreferences: {// preload: process.env.WEBPACK_DEV_SERVER_URL ? __dirname /preload.js : app://./preload.js,…

leetcode172. 阶乘后的零(java)

阶乘后的零 题目描述巧妙的解法代码演示 上期经典 题目描述 难度 - 中等 172. 阶乘后的零 给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * … * 3 * 2 * 1 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;0 解释&#…

【算法刷题-栈与队列篇】

目录 1.leetcode-232. 用栈实现队列2.leetcode-225. 用队列实现栈3.leetcode-20. 有效的括号&#xff08;1&#xff09;代码1&#xff08;2&#xff09;代码2 4.leetcode-1047. 删除字符串中的所有相邻重复项5.leetcode-150. 逆波兰表达式求值6.leetcode-239. 滑动窗口最大值7.…

C盘清理 “ProgramData\Microsoft\Search“ 文件夹过大

修改索引存放位置 进入控制面板->查找方式改成大图标&#xff0c; 选择索引选项 进入高级 填写新的索引位置 删除C盘索引信息 删除C:\ProgramData\Microsoft\Search\Data\Applications 下面的文件夹 如果报索引正在使用&#xff0c;参照第一步替换索引位置。关闭索引

【conan】c++包管理工具,conan教程

文章目录 介绍Build a simple CMake project using ConanUsing build tools as Conan packagesBuilding for multiple configurations:Release, Debug, Static and Shared 修改Conan profile&#xff0c;达到自己的编译目的Understanding the flexibility of using conanfile.p…

内网穿透神器-frp的概念,搭建和使用,方便访问内网服务

FRP概念 FRP是什么(借助官网的描述)&#xff1f; frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 为什么是用FR…

【斗破】魔兽山脉回归,彩鳞牵手手萧炎老公,小医仙大战美杜莎

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析【斗破苍穹年番】 斗破苍穹年番动画更新了&#xff0c;云岚宗正式解散&#xff0c;云韵道别&#xff0c;携手纳兰嫣然闯荡中州&#xff0c;而萧炎联合海老&#xff0c;也创立了加玛帝国第一势力炎盟&#xff0c;有了保护萧…

DRM全解析 —— ADD_FB(2)

接前一篇文章&#xff1a;DRM全解析 —— ADD_FB&#xff08;1&#xff09; 本文参考以下博文&#xff1a; DRM驱动&#xff08;四&#xff09;之ADD_FB 特此致谢&#xff01; 上一回围绕libdrm与DRM在Linux内核中的接口&#xff1a; DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, d…

Linux驱动之Linux自带的LED灯驱动

目录 一、简介 二、使能Linux自带LED驱动 三、Linux内核自带LED驱动框架 四、设备树节点编写 五、运行测试 一、简介 前面我们都是自己编写 LED 灯驱动&#xff0c;其实像 LED 灯这样非常基础的设备驱动&#xff0c; Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 …

Qt Creator 创建 Qt 默认窗口程序

Qt 入门实战教程&#xff08;目录&#xff09; Windows Qt 5.12.10下载与安装 使用Qt Creator 本文介绍用Qt自带的集成开发工具Qt Creator创建Qt默认的窗口程序。 本文不需要你另外安装Visual Studio 2022这样的集成开发环境&#xff0c;也不需要你再在Visual Studio 2022中…