Método de visualização de vazamento de memória

definição:

A memória está ocupada e não é liberada após o uso

causa:

Não há correspondente livre ou exclusão após usar malloc ou nova operação

prejuízo:

Depois que uma grande quantidade de memória é consumida, o programa fica cada vez mais lento

Vazamento de memória encontrado

  • ps-aux

    Verifique a taxa de ocupação de memória de cada processo. Se a memória ocupada por um processo continuar aumentando, é provável que ocorra um vazamento de memória

  • Outros comandos grátis

     Veja o uso de memória de todo o sistema

método

Defina uma classe sobre novo, e então sobrecarregue o novo operador, salve a localização e o arquivo de cada novo definido no array, quando o novo não for excluído, a localização será exibida

Código:

main.cpp

#include"DebugNew.h"

int main()
{
	int *p = new int;

	return 0;
}



DebugNew.h

#ifndef DEBUG_NEW_H_
#define DEBUG_NEW_H_
#include"TreacNew.h"

//全局对象
//记录 new 记录
//     delete 删除记录一次

#define new new(__FILE__,__LINE__)

#endif   

TreacNew.h

#include<map>

void *operator new(size_t size, const char *file, long line);
void operator delete(void *p);

class TreacNew
{
	class TracerNewInfo
	{
	public:
		TracerNewInfo(const char *file = nullptr, long line = 0);
		const char *File() const;
		long Line() const;
	private:
		const char *file_;
		long line_;
	};
public:
	static bool Ready;
	TreacNew();
	~TreacNew();
	void Add(void *p, const char *file, long line);
	void Remove(void *p);
	void Dump();
private:
	std::map<void *, TracerNewInfo> treaer_infos_;
};

extern TreacNew NewTrace;

TreacNew.cpp

#include "TreacNew.h"
#include<cstdlib>
#include<iostream>

TreacNew NewTrace;
bool TreacNew::Ready = false;

TreacNew::TreacNew()
{
	TreacNew::Ready = true;
}


TreacNew::~TreacNew()
{
	TreacNew::Ready = false;
	Dump();
}

void *operator new(size_t size, const char *file, long line)
{
	void *p = malloc(size);
	//开始记录
	NewTrace.Add(p, file, line);
	return p;
}

void operator delete(void *p)
{
	if (TreacNew::Ready)
	{
		NewTrace.Remove(p);
	}
	free(p);
}

TreacNew::TracerNewInfo::TracerNewInfo(const char *file, long line) :file_(file), line_(line)
{

}

const char* TreacNew::TracerNewInfo::File() const
{
	return file_;
}

long TreacNew::TracerNewInfo::Line() const
{
	return line_;
}

void TreacNew::Add(void *p, const char *file, long line)
{
	treaer_infos_[p] = TracerNewInfo(file, line);
}

void TreacNew::Remove(void *p)
{
	auto it = treaer_infos_.find(p);
	if (it != treaer_infos_.end())
	{
		treaer_infos_.erase(it);
	}
}

void TreacNew::Dump()
{
	for (auto tracer_info : treaer_infos_)
	{
		std::cout << "0x" << tracer_info.first << "\t" << tracer_info.second.File() << "\tIn Line" << tracer_info.second.Line() << std::endl;
	}
}

 

Acho que você gosta

Origin blog.csdn.net/qq_46423166/article/details/112311554
Recomendado
Clasificación