// errmem.cpp - Error por falta de memoria para asignación.
//                set_new_handler
#include <iostream>
#include <new>
using namespace std;

// Función que se ejecutará cuando new falle
void InsuficienteMemoria();

int main()
{
  // Tamaño de los bloques de memoria a asignar:
  const unsigned long TBloqueMem = 32768;

  // Registrar la función que manipulará el error producido
  // cuando new no obtiene el espacio de memoria solicitado
  set_new_handler( InsuficienteMemoria );

  // Matriz de punteros a los bloques de memoria asignados
  const short TotalBloques = 8;
  char* pBloqueMem[TotalBloques];

  // Asignar bloques de memoria
  int i = -1;
  do
  {
	  i++;
    pBloqueMem[i] = new char[TBloqueMem];
    if (pBloqueMem[i])
      cout << "bloque " << i << ", tamaño " << TBloqueMem << endl;
  }
  while ( pBloqueMem[i] && i < TotalBloques - 1);

  // Liberar la memoria asignada
  for (int k = 0; k <= i; k++)
    delete [] pBloqueMem[k];
}

void InsuficienteMemoria()
{
  // Esta función se ejecuta automáticamente cuando el operador
  // new no puede asignar memoria.
  cerr << "Error (new): memoria para asignación agotada.\n";

  // Lanzar una excepción de falta de memoria
  throw bad_alloc();
}

