1// Copyright (C) 2004-2015 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 3, 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 COPYING3. If not see 16// <http://www.gnu.org/licenses/>. 17 18#include <ext/new_allocator.h> 19 20using namespace std; 21using __gnu_cxx::new_allocator; 22 23template<typename T> 24 class clear_alloc : public new_allocator<T> 25 { 26 public: 27 28 template <typename T1> 29 struct rebind 30 { typedef clear_alloc<T1> other; }; 31 32 virtual void clear() throw() 33 { } 34 35 clear_alloc() throw() 36 { } 37 38 clear_alloc(clear_alloc const&) throw() : new_allocator<T>() 39 { } 40 41 template<typename T1> 42 clear_alloc(clear_alloc<T1> const&) throw() 43 { } 44 45 virtual ~clear_alloc() throw() 46 { this->clear(); } 47 48 T* allocate(typename new_allocator<T>::size_type n, const void *hint = 0) 49 { 50 this->clear(); 51 return new_allocator<T>::allocate(n, hint); 52 } 53 54 void deallocate(T *ptr, typename new_allocator<T>::size_type n) 55 { 56 this->clear(); 57 new_allocator<T>::deallocate(ptr, n); 58 } 59 }; 60 61template<typename Container> 62 void Check_Container() 63 { 64 Container* pic = new Container; 65 int x = 230; 66 67 while (x--) 68 { 69 pic->push_back(x); 70 } 71 72 pic->get_allocator(); 73 74 // The following has led to infinite recursions or cores. 75 pic->clear(); 76 77 delete pic; 78 } 79