16. ¿Y si new no consigue espacio?

¿Que pasaría si el operador new no pudiera dar cabida a la solicitud de espacio?

Hasta ahora asumimos que el operador new regresa una dirección de memoria donde comienza el espacio solicitado, pero esto en algún caso puede ser que no sea posible, dijimos que si no hay espacio el puntero que retorna sería NULL, esto no parcialmente cierto.

New tiene la posibilidad de recibir un "argumento" , es una constante llamada nothrow, con el único propósito de activar una versión sobrecargada de la función operator new (o operator new []) que toma un argumento de este tipo..

Ver documentación de referencia:https://cplusplus.com/reference/new/nothrow/

La sobrecarga de operadores es uno de los mecanismos que nos permite ampliar o reinterpretar las capacidades de operadores o funciones. Pensamos que en Python donde "sumaba" dos strings, pero en realidad está mal decir que suma.. sería mas apropiado decir concatena, en ese caso el + (suma) se puede pensar como un operador sobrecargado.


En C ++, la función new del operador se puede sobrecargar para tomar más de un parámetro: el primer parámetro que se pasa a la función nueva del operador es siempre el tamaño del almacenamiento que se asignará, pero se pueden pasar argumentos adicionales ( por ejemplo nothrow) a esta función encerrándolos en paréntesis en la nueva expresión.

Controlar la dirección que regresa new que no sea NULL!!


// Ejemplo de nothrow
#include <iostream>
#include <new>
using namespace std;
int main () {
cout << "Tratando de obtener 1 MB de memoria.... ";
char* p = new (nothrow) char [1048576];
if (!p) {             // Si el puntero es NULO no hay espacio en memoria
cout << "Fallo, no puedo obtener espacio en memoria!\n";
}
else {
cout << "Exitoso!!\n";
delete[] p; } return 0; }