カスタム検索

メモリ・リークの検出コード(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

Valid XHTML 1.0!