#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPG11dGV4PgoKY2xhc3MgTWVtVHJhY2tlcgp7Cglwcml2YXRlOgoJCXN0YXRpYyBjaGFyIGZ1bmNfbmFtZVsxMDBdOwoJCXN0YXRpYyBzaXplX3QgY3VycmVudF9zaXplOwoJCXN0YXRpYyBzdGQ6Om11dGV4IG1lbV9sb2NrOwoJCQoJcHVibGljOgoJCU1lbVRyYWNrZXIoY29uc3QgY2hhciogRnVuY05hbWUpIHtzdHJjcHkoJmZ1bmNfbmFtZVswXSwgRnVuY05hbWUpO30KCQlzdGF0aWMgdm9pZCBpbmMoc2l6ZV90IGFtb3VudCkge2N1cnJlbnRfc2l6ZSArPSBhbW91bnQ7fQoJCXN0YXRpYyB2b2lkIHByaW50KCkge3N0ZDo6Y291dDw8ZnVuY19uYW1lPDwiIGFsbG9jYXRlZDogIjw8Y3VycmVudF9zaXplPDwiIGJ5dGVzLlxuIjt9CgkJc3RhdGljIHZvaWQgcmVzZXQoKSB7Y3VycmVudF9zaXplID0gMDsgbWVtc2V0KCZmdW5jX25hbWVbMF0sIDAsIHNpemVvZihmdW5jX25hbWUpL3NpemVvZihjaGFyKSk7fQp9OwoKY2hhciBNZW1UcmFja2VyOjpmdW5jX25hbWVbMTAwXSA9IHswfTsKc2l6ZV90IE1lbVRyYWNrZXI6OmN1cnJlbnRfc2l6ZSA9IDA7CnN0ZDo6bXV0ZXggTWVtVHJhY2tlcjo6bWVtX2xvY2s7CgoKdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKQp7CglNZW1UcmFja2VyOjppbmMoc2l6ZSk7CglyZXR1cm4gbWFsbG9jKHNpemUpOwp9Cgp2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwdHIpCnsKCWZyZWUocHRyKTsKfQoKCnZvaWQgRnVuY09uZSgpCnsKCU1lbVRyYWNrZXIoX19mdW5jX18pOwoJCglpbnQqIGkgPSBuZXcgaW50WzEwMF07CglkZWxldGVbXSBpOwoJaSA9IG5ldyBpbnRbMjAwXTsKCWRlbGV0ZVtdIGk7CgkKCU1lbVRyYWNrZXI6OnByaW50KCk7CglNZW1UcmFja2VyOjpyZXNldCgpOwp9Cgp2b2lkIEZ1bmNUd28oKQp7CglNZW1UcmFja2VyKF9fZnVuY19fKTsKCWNoYXIqIGMgPSBuZXcgY2hhclsxMDI0XTsKCWRlbGV0ZVtdIGM7CgljID0gbmV3IGNoYXJbMjA0OF07CglkZWxldGVbXSBjOwoJCglNZW1UcmFja2VyOjpwcmludCgpOwoJTWVtVHJhY2tlcjo6cmVzZXQoKTsKfQoKaW50IG1haW4oKQp7CglGdW5jT25lKCk7CglGdW5jVHdvKCk7CglGdW5jVHdvKCk7CglGdW5jVHdvKCk7CglyZXR1cm4gMDsKfQ==