1// Copyright (C) 2004 Free Software Foundation, Inc. 2// 3// This file is part of the GNU ISO C++ Library. This library is free 4// software; you can redistribute it and/or modify it under the 5// terms of the GNU General Public License as published by the 6// Free Software Foundation; either version 2, or (at your option) 7// any later version. 8 9// This library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU General Public License for more details. 13 14// You should have received a copy of the GNU General Public License along 15// with this library; see the file COPYING. If not, write to the Free 16// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 17// USA. 18 19#include <list> 20#include <ext/new_allocator.h> 21 22using namespace std; 23using __gnu_cxx::new_allocator; 24 25template<typename T> 26 class clear_alloc : public new_allocator<T> 27 { 28 public: 29 30 template <typename T1> 31 struct rebind 32 { typedef clear_alloc<T1> other; }; 33 34 virtual void clear() throw() 35 { } 36 37 clear_alloc() throw() 38 { } 39 40 clear_alloc(clear_alloc const&) throw() : new_allocator<T>() 41 { } 42 43 template<typename T1> 44 clear_alloc(clear_alloc<T1> const&) throw() 45 { } 46 47 virtual ~clear_alloc() throw() 48 { this->clear(); } 49 50 T* allocate(typename new_allocator<T>::size_type n, const void *hint = 0) 51 { 52 this->clear(); 53 return new_allocator<T>::allocate(n, hint); 54 } 55 56 void deallocate(T *ptr, typename new_allocator<T>::size_type n) 57 { 58 this->clear(); 59 new_allocator<T>::deallocate(ptr, n); 60 } 61 }; 62 63template<typename Container> 64 void Check_Container() 65 { 66 Container* pic = new Container; 67 int x = 230; 68 69 while (x--) 70 { 71 pic->push_back(x); 72 } 73 74 pic->get_allocator(); 75 76 // The following has led to infinite recursions or cores. 77 pic->clear(); 78 79 delete pic; 80 } 81 82 83int main() 84{ 85 Check_Container<std::list<int, clear_alloc<int> > >(); 86 return 0; 87} 88 89