1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #define _ITERATOR_DEBUG_LEVEL 0 #include <memory> #include <vector> #include <string> #include <iostream> template<class TrackType> size_t* mem_used() {static size_t s = 0; return &s;} template<class T, class TrackType, class BaseAllocator = std::allocator<T> > class TrackerAllocator : public BaseAllocator { public: typedef typename BaseAllocator::pointer pointer; typedef typename BaseAllocator::size_type size_type; TrackerAllocator() throw() : BaseAllocator() {} TrackerAllocator(const TrackerAllocator& b) throw() : BaseAllocator(b) {} TrackerAllocator(TrackerAllocator&& b) throw() : BaseAllocator(b) {} template <class U> TrackerAllocator(const typename TrackerAllocator::template rebind<U>::other& b) throw() : BaseAllocator(b) {} ~TrackerAllocator() {} TrackerAllocator<T,TrackType,BaseAllocator> operator=(const TrackerAllocator& b) {BaseAllocator::operator=(b);} TrackerAllocator<T,TrackType,BaseAllocator> operator=(TrackerAllocator&& b) {BaseAllocator::operator=(b);} template <class U> TrackerAllocator<T,TrackType,BaseAllocator> operator=(const typename TrackerAllocator::template rebind<U>::other& b) {BaseAllocator::operator=(b);} template<class U> struct rebind { typedef TrackerAllocator<U, TrackType, typename BaseAllocator::template rebind<U>::other> other; }; pointer allocate(size_type n) { pointer r = BaseAllocator::allocate(n); *mem_used<TrackType>() += n; return r; } pointer allocate(size_type n, pointer h) { pointer r = BaseAllocator::allocate(n, h); *mem_used<TrackType>() += n; return r; } void deallocate(pointer p, size_type n) throw() { BaseAllocator::deallocate(p, n); *mem_used<TrackType>() -= n; } }; typedef std::basic_string<char, std::char_traits<char>, TrackerAllocator<char, std::string> > trackstring; typedef std::vector<int, TrackerAllocator<int, std::vector<int> > > trackvector; // ^ ^ // This identifies which memory to track // it can be any type, related or no. // All with the same type will be tracked togeather int main() { trackstring mystring1("HELLO WORLD"); std::cout << *mem_used<std::string>() << '\n'; //display memory usage of all strings trackstring mystring2("MUCH LONGER STRING THAT DEFINITELY GETS HEAP ALLOCATED!"); std::cout << *mem_used<std::string>() << '\n'; //display memory usage of all strings trackvector myvec(mystring1.begin(), mystring1.end()); std::cout << *mem_used<std::vector<int> >() << '\n'; //display memory usage of all vector<int> // ^ ^ // This identifies which memory type from above to look up. return 0; } |
I2RlZmluZSBfSVRFUkFUT1JfREVCVUdfTEVWRUwgMAojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTxjbGFzcyBUcmFja1R5cGU+IApzaXplX3QqIG1lbV91c2VkKCkge3N0YXRpYyBzaXplX3QgcyA9IDA7IHJldHVybiAmczt9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUcmFja1R5cGUsIGNsYXNzIEJhc2VBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxUPiA+IApjbGFzcyBUcmFja2VyQWxsb2NhdG9yIDogcHVibGljIEJhc2VBbGxvY2F0b3IgewpwdWJsaWM6Cgl0eXBlZGVmIHR5cGVuYW1lIEJhc2VBbGxvY2F0b3I6OnBvaW50ZXIgcG9pbnRlcjsKCXR5cGVkZWYgdHlwZW5hbWUgQmFzZUFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKCiAgICBUcmFja2VyQWxsb2NhdG9yKCkgdGhyb3coKSA6IEJhc2VBbGxvY2F0b3IoKSB7fQogICAgVHJhY2tlckFsbG9jYXRvcihjb25zdCBUcmFja2VyQWxsb2NhdG9yJiBiKSB0aHJvdygpIDogQmFzZUFsbG9jYXRvcihiKSB7fQogICAgVHJhY2tlckFsbG9jYXRvcihUcmFja2VyQWxsb2NhdG9yJiYgYikgdGhyb3coKSA6IEJhc2VBbGxvY2F0b3IoYikge30KICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBUcmFja2VyQWxsb2NhdG9yKGNvbnN0IHR5cGVuYW1lIFRyYWNrZXJBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxVPjo6b3RoZXImIGIpIHRocm93KCkgOiBCYXNlQWxsb2NhdG9yKGIpIHt9CiAgICB+VHJhY2tlckFsbG9jYXRvcigpIHt9CglUcmFja2VyQWxsb2NhdG9yPFQsVHJhY2tUeXBlLEJhc2VBbGxvY2F0b3I+IG9wZXJhdG9yPShjb25zdCBUcmFja2VyQWxsb2NhdG9yJiBiKSB7QmFzZUFsbG9jYXRvcjo6b3BlcmF0b3I9KGIpO30KCVRyYWNrZXJBbGxvY2F0b3I8VCxUcmFja1R5cGUsQmFzZUFsbG9jYXRvcj4gb3BlcmF0b3I9KFRyYWNrZXJBbGxvY2F0b3ImJiBiKSB7QmFzZUFsbG9jYXRvcjo6b3BlcmF0b3I9KGIpO30KCXRlbXBsYXRlIDxjbGFzcyBVPiBUcmFja2VyQWxsb2NhdG9yPFQsVHJhY2tUeXBlLEJhc2VBbGxvY2F0b3I+IG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBUcmFja2VyQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8VT46Om90aGVyJiBiKSB7QmFzZUFsbG9jYXRvcjo6b3BlcmF0b3I9KGIpO30KCgl0ZW1wbGF0ZTxjbGFzcyBVPiBzdHJ1Y3QgcmViaW5kIHsKICAgICAgICB0eXBlZGVmIFRyYWNrZXJBbGxvY2F0b3I8VSwgVHJhY2tUeXBlLCB0eXBlbmFtZSBCYXNlQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8VT46Om90aGVyPiBvdGhlcjsKICAgIH07CgogICAgcG9pbnRlciBhbGxvY2F0ZShzaXplX3R5cGUgbikgewogICAgICAgIHBvaW50ZXIgciA9IEJhc2VBbGxvY2F0b3I6OmFsbG9jYXRlKG4pOwogICAgICAgICptZW1fdXNlZDxUcmFja1R5cGU+KCkgKz0gbjsKCQlyZXR1cm4gcjsKICAgIH0KICAgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIG4sIHBvaW50ZXIgaCkgewogICAgICAgIHBvaW50ZXIgciA9IEJhc2VBbGxvY2F0b3I6OmFsbG9jYXRlKG4sIGgpOwogICAgICAgICptZW1fdXNlZDxUcmFja1R5cGU+KCkgKz0gbjsKCQlyZXR1cm4gcjsKICAgIH0KICAgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIHAsIHNpemVfdHlwZSBuKSB0aHJvdygpIHsKICAgICAgICBCYXNlQWxsb2NhdG9yOjpkZWFsbG9jYXRlKHAsIG4pOwogICAgICAgICptZW1fdXNlZDxUcmFja1R5cGU+KCkgLT0gbjsKICAgIH0KfTsKCnR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja2VyQWxsb2NhdG9yPGNoYXIsIHN0ZDo6c3RyaW5nPiA+IHRyYWNrc3RyaW5nOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPGludCwgCiAgICAgICAgICAgICAgICAgICAgVHJhY2tlckFsbG9jYXRvcjxpbnQsIHN0ZDo6dmVjdG9yPGludD4gPiA+IHRyYWNrdmVjdG9yOwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgXgovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlkZW50aWZpZXMgd2hpY2ggbWVtb3J5IHRvIHRyYWNrCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNhbiBiZSBhbnkgdHlwZSwgcmVsYXRlZCBvciBuby4KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHdpdGggdGhlIHNhbWUgdHlwZSB3aWxsIGJlIHRyYWNrZWQgdG9nZWF0aGVyCmludCBtYWluKCkgewogICAgdHJhY2tzdHJpbmcgbXlzdHJpbmcxKCJIRUxMTyBXT1JMRCIpOwogICAgc3RkOjpjb3V0IDw8ICptZW1fdXNlZDxzdGQ6OnN0cmluZz4oKSA8PCAnXG4nOyAvL2Rpc3BsYXkgbWVtb3J5IHVzYWdlIG9mIGFsbCBzdHJpbmdzCgogICAgdHJhY2tzdHJpbmcgbXlzdHJpbmcyKCJNVUNIIExPTkdFUiBTVFJJTkcgVEhBVCBERUZJTklURUxZIEdFVFMgSEVBUCBBTExPQ0FURUQhIik7CiAgICBzdGQ6OmNvdXQgPDwgKm1lbV91c2VkPHN0ZDo6c3RyaW5nPigpIDw8ICdcbic7IC8vZGlzcGxheSBtZW1vcnkgdXNhZ2Ugb2YgYWxsIHN0cmluZ3MKCiAgICB0cmFja3ZlY3RvciBteXZlYyhteXN0cmluZzEuYmVnaW4oKSwgbXlzdHJpbmcxLmVuZCgpKTsKICAgIHN0ZDo6Y291dCA8PCAqbWVtX3VzZWQ8c3RkOjp2ZWN0b3I8aW50PiA+KCkgPDwgJ1xuJzsgLy9kaXNwbGF5IG1lbW9yeSB1c2FnZSBvZiBhbGwgdmVjdG9yPGludD4KICAgIC8vICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgIF4KICAgIC8vICAgICAgICAgICAgICAgICAgICAgVGhpcyBpZGVudGlmaWVzIHdoaWNoIG1lbW9yeSB0eXBlIGZyb20gYWJvdmUgdG8gbG9vayB1cC4KCXJldHVybiAwOwp9
-
upload with new input
-
result: Success time: 0s memory: 2964 kB returned value: 0
24 92 11


