/* Copyright (C) 2000, 2001 Stephen Cleary * Copyright (C) 2011 Kwan Ting Chan * * Use, modification and distribution is subject to the * Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) */ #ifndef BOOST_POOL_TRACK_ALLOCATOR_HPP #define BOOST_POOL_TRACK_ALLOCATOR_HPP #include #include #include #include #include // Each "tester" object below checks into and out of the "cdtor_checker", // which will check for any problems related to the construction/destruction of // "tester" objects. class cdtor_checker { private: // Each constructed object registers its "this" pointer into "objs" std::set objs; public: // True iff all objects that have checked in have checked out bool ok() const { return objs.empty(); } ~cdtor_checker() { BOOST_TEST(ok()); } void check_in(void * const This) { BOOST_TEST(objs.find(This) == objs.end()); objs.insert(This); } void check_out(void * const This) { BOOST_TEST(objs.find(This) != objs.end()); objs.erase(This); } }; static cdtor_checker mem; struct tester { tester(bool throw_except = false) { if(throw_except) { throw std::logic_error("Deliberate constructor exception"); } mem.check_in(this); } tester(const tester &) { mem.check_in(this); } ~tester() { mem.check_out(this); } }; // Allocator that registers alloc/dealloc to/from the system memory struct track_allocator { typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; static std::set allocated_blocks; static char* malloc(const size_type bytes) { char* const ret = new (std::nothrow) char[bytes]; allocated_blocks.insert(ret); return ret; } static void free(char* const block) { BOOST_TEST(allocated_blocks.find(block) != allocated_blocks.end()); allocated_blocks.erase(block); delete [] block; } static bool ok() { return allocated_blocks.empty(); } }; std::set track_allocator::allocated_blocks; #endif // BOOST_POOL_TRACK_ALLOCATOR_HPP