#include <iostream>
#include <cstring>
#include <mutex>

class MemTracker
{
	private:
		static char func_name[100];
		static size_t current_size;
		static std::mutex mem_lock;
		
	public:
		MemTracker(const char* FuncName) {strcpy(&func_name[0], FuncName);}
		static void inc(size_t amount) {current_size += amount;}
		static void print() {std::cout<<func_name<<" allocated: "<<current_size<<" bytes.\n";}
		static void reset() {current_size = 0; memset(&func_name[0], 0, sizeof(func_name)/sizeof(char));}
};

char MemTracker::func_name[100] = {0};
size_t MemTracker::current_size = 0;
std::mutex MemTracker::mem_lock;


void* operator new(size_t size)
{
	MemTracker::inc(size);
	return malloc(size);
}

void operator delete(void* ptr)
{
	free(ptr);
}


void FuncOne()
{
	MemTracker(__func__);
	
	int* i = new int[100];
	delete[] i;
	i = new int[200];
	delete[] i;
	
	MemTracker::print();
	MemTracker::reset();
}

void FuncTwo()
{
	MemTracker(__func__);
	char* c = new char[1024];
	delete[] c;
	c = new char[2048];
	delete[] c;
	
	MemTracker::print();
	MemTracker::reset();
}

int main()
{
	FuncOne();
	FuncTwo();
	FuncTwo();
	FuncTwo();
	return 0;
}