// // collector_test.cpp // // Copyright (c) 2003 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include // sp_collector.cpp exported functions std::size_t find_unreachable_objects(bool report); void free_unreachable_objects(); struct X { void* fill[32]; boost::shared_ptr p; }; void report() { std::cout << "Calling find_unreachable_objects:\n"; std::clock_t t = std::clock(); std::size_t n = find_unreachable_objects(false); t = std::clock() - t; std::cout << n << " unreachable objects.\n"; std::cout << " " << static_cast(t) / CLOCKS_PER_SEC << " seconds.\n"; } void free() { std::cout << "Calling free_unreachable_objects:\n"; std::clock_t t = std::clock(); free_unreachable_objects(); t = std::clock() - t; std::cout << " " << static_cast(t) / CLOCKS_PER_SEC << " seconds.\n"; } int main() { std::vector< boost::shared_ptr > v1, v2; int const n = 256 * 1024; std::cout << "Filling v1 and v2\n"; for(int i = 0; i < n; ++i) { v1.push_back(boost::shared_ptr(new X)); v2.push_back(boost::shared_ptr(new X)); } report(); std::cout << "Creating the cycles\n"; for(int i = 0; i < n - 1; ++i) { v2[i]->p = v2[i+1]; } v2[n-1]->p = v2[0]; report(); std::cout << "Resizing v2 to size of 1\n"; v2.resize(1); report(); std::cout << "Clearing v2\n"; v2.clear(); report(); std::cout << "Clearing v1\n"; v1.clear(); report(); free(); report(); }