你的实现应该通过下面的测试用例:
#include "CountData.hpp"
#include <memory>
#include <vector>
#include <thread>
#include <future>
class A
{
public:
memory_leak_counter<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;//这里泄漏1次
new A[5];//这里泄漏5个
auto p2 = CreateA();
delete p2;
f();//这里泄漏了1次
auto listA = std::vector<std::shared_ptr<A>>(5, std::make_shared<A>());//这里没有泄露
for (int i = 0; i < 3; ++i)
{
listA.push_back(std::make_shared<A>());//这里没有泄漏
}
}
输出如下:
内存泄漏检测工具实现:
#ifndef _COUNTDATA_H_
#define _COUNTDATA_H_
//内存泄漏检测 begin
#include <assert.h>
#include <iostream>
#include <atomic>
#include <string>
class count_data {
public:
count_data(const char* name) :m_name(name), counter_created(0) {};
~count_data()
{
std::cout<< m_name<<" created = "<<counter_created
<<", destoryed = "<<counter_destroyed
<< ", memory leak= " << counter_created-counter_destroyed << std::endl;;
};
void inc() { ++counter_created; }
void dec() { ++counter_destroyed; }
private:
std::atomic<long long> counter_created;
std::atomic<long long> counter_destroyed;
std::string m_name;
};
template<typename T>
class memory_leak_counter {
public:
memory_leak_counter() { m_data.inc(); }
~memory_leak_counter() { m_data.dec(); }
memory_leak_counter(const memory_leak_counter&) { m_data.inc(); }
private:
//一个类只有这一个对象,这个对象维护计数器
static count_data m_data;
};
//TIPS:模板类的静态成员可以定义在头文件中,被链接程序特殊处理
template<typename T>
count_data memory_leak_counter<T>::m_data(typeid(T).name());
//示例用法
/*
class A
{
public:
//这个对象的复制析构引发该类memory_leak_counter静态成员m_data的计数
memory_leak_counter<A> m_checker;
};
*/
//内存泄漏检测 end
#endif