1 // 2 // collector_test.cpp 3 // 4 // Copyright (c) 2003 Peter Dimov 5 // 6 // Distributed under the Boost Software License, Version 1.0. (See 7 // accompanying file LICENSE_1_0.txt or copy at 8 // http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #include <boost/shared_ptr.hpp> 12 #include <vector> 13 #include <iostream> 14 #include <cstdlib> 15 #include <ctime> 16 17 // sp_collector.cpp exported functions 18 19 std::size_t find_unreachable_objects(bool report); 20 void free_unreachable_objects(); 21 22 struct X 23 { 24 void* fill[32]; 25 boost::shared_ptr<X> p; 26 }; 27 report()28void report() 29 { 30 std::cout << "Calling find_unreachable_objects:\n"; 31 32 std::clock_t t = std::clock(); 33 34 std::size_t n = find_unreachable_objects(false); 35 36 t = std::clock() - t; 37 38 std::cout << n << " unreachable objects.\n"; 39 std::cout << " " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n"; 40 } 41 free()42void free() 43 { 44 std::cout << "Calling free_unreachable_objects:\n"; 45 46 std::clock_t t = std::clock(); 47 48 free_unreachable_objects(); 49 50 t = std::clock() - t; 51 52 std::cout << " " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n"; 53 } 54 main()55int main() 56 { 57 std::vector< boost::shared_ptr<X> > v1, v2; 58 59 int const n = 256 * 1024; 60 61 std::cout << "Filling v1 and v2\n"; 62 63 for(int i = 0; i < n; ++i) 64 { 65 v1.push_back(boost::shared_ptr<X>(new X)); 66 v2.push_back(boost::shared_ptr<X>(new X)); 67 } 68 69 report(); 70 71 std::cout << "Creating the cycles\n"; 72 73 for(int i = 0; i < n - 1; ++i) 74 { 75 v2[i]->p = v2[i+1]; 76 } 77 78 v2[n-1]->p = v2[0]; 79 80 report(); 81 82 std::cout << "Resizing v2 to size of 1\n"; 83 84 v2.resize(1); 85 report(); 86 87 std::cout << "Clearing v2\n"; 88 89 v2.clear(); 90 report(); 91 92 std::cout << "Clearing v1\n"; 93 94 v1.clear(); 95 report(); 96 97 free(); 98 report(); 99 } 100