メモリ・リークの検出コード(C++)
delete に無理がありますが、以下のような感じで、作ってみました
#include <iostream>
#include <map>
#include <string>
#include <cstdlib>
struct meminfo_{
void* member_p;
std::string member_file;
int member_line;
};
typedef std::map<void*, meminfo_> type_addr;
type_addr global_addr;
void* __malloc__(const std::size_t size, const char* file, const int line)
{
meminfo_ info;
info.member_file = file;
info.member_line = line;
void* p = malloc(size ? size : 1);
if (p){
info.member_p;
global_addr[p] = info;
}
return p;
}
void* __realloc__(void* x, const std::size_t size, const char* file, const int line)
{
if (x){
type_addr::iterator it = global_addr.find(x);
if (global_addr.end() != it){
global_addr.erase(it);
}
}
meminfo_ info;
info.member_file = file;
info.member_line = line;
void* p = realloc(x, size ? size : 1);
if (p){
info.member_p;
global_addr[p] = info;
}
return p;
}
void __free__(void* x)
{
if (x){
type_addr::iterator it = global_addr.find(x);
if (global_addr.end() != it){
global_addr.erase(it);
}
}
free(x);
}
void* operator new(const std::size_t size, const char* file, const int line)
{
meminfo_ info;
info.member_file = file;
info.member_line = line;
void* p = malloc(size ? size : 1);
if (p){
info.member_p;
global_addr[p] = info;
}
return p;
}
void operator delete(void* x)
{
if (x){
type_addr::iterator it = global_addr.find(x);
if (global_addr.end() != it){
global_addr.erase(it);
}
}
free(x);
}
#define malloc(x) __malloc__((x), __FILE__, __LINE__)
#define realloc(x, size) __realloc__((x), (size), __FILE__, __LINE__)
#define free(x) __free__(x)
#define new new(__FILE__, __LINE__)
#define delete(x) operator delete(x);
#define delete_v(x) operator delete [] (x);
int main()
{
char* p = (char*)malloc(100);
if (p){
p = (char*)realloc(p, 200);
if (p){
// free(p);
// p = NULL;
}
}
char* q = new char[100];
if (q){
// delete_v(q);
// q = NULL;
}
for (type_addr::iterator it = global_addr.begin();
global_addr.end() != it; ++it){
meminfo_ info = it->second;
std::cout << "メモリ解放忘れ(ファイル名): " << info.member_file << std::endl;
std::cout << "メモリ解放忘れ(行番号): " << info.member_line << std::endl;
}
getchar();
return 0;
}
HOME