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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | /** Trying this again. Simpler approach, maybe... **/ #include <cstddef> #include <limits> #include <new> #include <stdexcept> #include <iostream> #include <cstdlib> template <typename T> class MemoryManager { public: /** Typedefs **/ typedef T * pointer; typedef const T * const_pointer; typedef T& reference; typedef const T& const_reference; typedef T value_type; typedef size_t size_type; typedef ptrdiff_t difference_type; T* allocate(size_t n) const; void deallocate(T* const buffer, size_t) const; void construct(T* const ptr, const T& value) const; size_t max_size() const; MemoryManager() {}; template <typename U> struct rebind { typedef MemoryManager<U> other; }; }; template <typename T> T* MemoryManager<T>::allocate(size_t n) const { if(n == 0) return NULL; if(n > max_size()) { throw std::length_error("Integer overflow at MemoryManager::allocate()"); } T* buffer = static_cast<T*>(malloc(n * sizeof(T))); if(buffer == NULL) { throw std::bad_alloc(); } std::cout << (n * sizeof(T)) << " bytes allocated.\n"; return buffer; } template <typename T> void MemoryManager<T>::deallocate(T* const buffer, size_t) const { free(buffer); std::cout << "Buffer deallocated.\n"; } template <typename T> void MemoryManager<T>::construct(T* const ptr, const T& value) const { void* const placement = static_cast<void*>(ptr); new (placement) T(value); } template <typename T> size_t MemoryManager<T>::max_size() const { return std::numeric_limits<size_t>::max(); } #include <vector> #include <iostream> int main() { auto f = [&](int i){std::cout<< i << "\t";}; std::vector<int, MemoryManager<int> > v = {1,2,3,4,5}; for(int i : v) { f(i); } } |
LyoqIFRyeWluZyB0aGlzIGFnYWluLiBTaW1wbGVyIGFwcHJvYWNoLCBtYXliZS4uLgoqKi8KCiNpbmNsdWRlIDxjc3RkZGVmPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8bmV3PgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxjc3RkbGliPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE1lbW9yeU1hbmFnZXIKewogICAgcHVibGljOgogICAgLyoqIFR5cGVkZWZzICoqLwogICAgICAgIHR5cGVkZWYgVCAqIHBvaW50ZXI7CiAgICAgICAgdHlwZWRlZiBjb25zdCBUICogY29uc3RfcG9pbnRlcjsKICAgICAgICB0eXBlZGVmIFQmIHJlZmVyZW5jZTsKICAgICAgICB0eXBlZGVmIGNvbnN0IFQmIGNvbnN0X3JlZmVyZW5jZTsKICAgICAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKICAgICAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CiAgICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwoKICAgICAgICBUKiBhbGxvY2F0ZShzaXplX3QgbikgY29uc3Q7CiAgICAgICAgdm9pZCBkZWFsbG9jYXRlKFQqIGNvbnN0IGJ1ZmZlciwgc2l6ZV90KSBjb25zdDsKICAgICAgICB2b2lkIGNvbnN0cnVjdChUKiBjb25zdCBwdHIsIGNvbnN0IFQmIHZhbHVlKSBjb25zdDsKICAgICAgICBzaXplX3QgbWF4X3NpemUoKSBjb25zdDsKICAgICAgICBNZW1vcnlNYW5hZ2VyKCkge307CgogICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBzdHJ1Y3QgcmViaW5kCiAgICAgICAgewogICAgICAgICAgICB0eXBlZGVmIE1lbW9yeU1hbmFnZXI8VT4gb3RoZXI7CiAgICAgICAgfTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpUKiBNZW1vcnlNYW5hZ2VyPFQ+OjphbGxvY2F0ZShzaXplX3QgbikgY29uc3QKewogICAgaWYobiA9PSAwKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmKG4gPiBtYXhfc2l6ZSgpKQogICAgewogICAgICAgIHRocm93IHN0ZDo6bGVuZ3RoX2Vycm9yKCJJbnRlZ2VyIG92ZXJmbG93IGF0IE1lbW9yeU1hbmFnZXI6OmFsbG9jYXRlKCkiKTsKICAgIH0KCiAgICBUKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxUKj4obWFsbG9jKG4gKiBzaXplb2YoVCkpKTsKCiAgICBpZihidWZmZXIgPT0gTlVMTCkKICAgIHsKICAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgfQoKICAgIHN0ZDo6Y291dCA8PCAobiAqIHNpemVvZihUKSkgPDwgIiBieXRlcyBhbGxvY2F0ZWQuXG4iOwogICAgcmV0dXJuIGJ1ZmZlcjsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgTWVtb3J5TWFuYWdlcjxUPjo6ZGVhbGxvY2F0ZShUKiBjb25zdCBidWZmZXIsIHNpemVfdCkgY29uc3QKewogICAgZnJlZShidWZmZXIpOwogICAgc3RkOjpjb3V0IDw8ICJCdWZmZXIgZGVhbGxvY2F0ZWQuXG4iOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBNZW1vcnlNYW5hZ2VyPFQ+Ojpjb25zdHJ1Y3QoVCogY29uc3QgcHRyLCBjb25zdCBUJiB2YWx1ZSkgY29uc3QKewogICAgdm9pZCogY29uc3QgcGxhY2VtZW50ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KHB0cik7CiAgICBuZXcgKHBsYWNlbWVudCkgVCh2YWx1ZSk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzaXplX3QgTWVtb3J5TWFuYWdlcjxUPjo6bWF4X3NpemUoKSBjb25zdAp7CiAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKTsKfQoKI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgppbnQgbWFpbigpCnsKICAgIGF1dG8gZiA9IFsmXShpbnQgaSl7c3RkOjpjb3V0PDwgaSA8PCAiXHQiO307CgoJc3RkOjp2ZWN0b3I8aW50LCBNZW1vcnlNYW5hZ2VyPGludD4gPiB2ID0gezEsMiwzLDQsNX07CgoJZm9yKGludCBpIDogdikKCXsKCQlmKGkpOwoJfQp9
-
upload with new input
-
result: Success time: 0s memory: 2984 kB returned value: 0
20 bytes allocated. 1 2 3 4 5 Buffer deallocated.


