#include <iostream>
#include <algorithm>
 
struct nur_zum_testen_t {} nur_zum_testen;
 
template <typename T>
class List {
  T * items;
  int size, capacity;
 public:
  List(const List& list);
 ~List() { delete[] items; }
 
  List(nur_zum_testen_t, T *items, int size, int capacity)
    : items(items), size(size), capacity(capacity) {}
};
 
template <class T> 
List<T>::List(const List& list) : 
    capacity(list.capacity), 
    items(new T[list.capacity]), 
    size(list.size)
{ 
    try
    {
        std::copy( list.items, list.items + size, items ); 
    }
    catch(...)
    {
        delete [] items;
        throw;
    }
}
 
int instances;
struct doofsinn {
  doofsinn() { ++instances; }
  ~doofsinn() { --instances; }
  doofsinn& operator=(doofsinn const&) {
    static int doofsinn_counter = 0;
    if (++doofsinn_counter % 5 == 0)
      throw "Sone";
  }
};
 
int main()
{
  {
    List<doofsinn> l(nur_zum_testen, new doofsinn[10] (), 10, 10);
    try { List<doofsinn> l2(l); } catch(...) {}
  }
  std::cout << instances << " instances still out there ...\n";
}
