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;
}
}