#include #include #include #include template class my_allocator : public std::allocator { private: std::string name_; template friend class my_allocator; public: typedef std::allocator base_type; template my_allocator(const my_allocator &b) : name_(b.name_) {} explicit my_allocator(const std::string &name = "default", const base_type &base = base_type()) : base_type(base), name_(name) {} template struct rebind { typedef my_allocator other; }; typename base_type::pointer allocate(typename base_type::size_type n) { typename base_type::pointer ans = base_type::allocate(n); if (ans) std::cout << "Allocated " << n << " bytes [name = " << name_ << ']' << std::endl; return ans; } typename base_type::pointer allocate(typename base_type::size_type n, typename base_type::const_pointer hint) { typename base_type::pointer ans = base_type::allocate(n, hint); if (ans) std::cout << "Allocated " << n << " bytes [name = " << name_ << ']' << std::endl; return ans; } }; int main() { int dummy = 0; std::vector > v(&dummy, &dummy, my_allocator("vector")); v.resize(17); boost::array zero = {{0, 0}}; boost::multi_array > m(zero, boost::c_storage_order(), my_allocator("multi_array")); boost::array dims = {{5, 3}}; m.resize(dims); return 0; }