A std::nothrow_t
existe la función de desasignación, pero no se puede llamar con una expresión delete
.
La función de desasignación está ahí para completarla. Si una expresión new
falla debido a una excepción, el compilador necesita liberar la memoria que asignó a través de operator new
con una llamada correspondiente al operator delete
. Entonces debe haber un operator delete
que acepte un std::nothrow_t
, para permitir esto.
(Es decir, en general, una expresión new
con la forma new (args...) T
va a asignar memoria con una llamada a operator new(sizeof(T), args...)
. Para "partido" se refiere a llamar operator delete
con los mismos argumentos, excepto la primera.)
Nota puede llamar al operador directamente: operator delete(memory, std::nothrow);
. Sin embargo, una expresión delete
nunca llama a una función de desasignación global con parámetros adicionales.
Así se puede "llamar" con:
struct always_throw
{
always_throw() { throw std::exception(); }
};
new (std::nothrow) always_throw;
En algún momento, esto va a asignar memoria con una llamada a:
void* __memory = operator new(sizeof(always_throw), std::nothrow);
Desde la inicialización del objeto tiros , el compilador necesita liberar la memoria asignada con una función de desasignación correspondiente, por lo que hace:
operator delete(__memory, std::nothrow);
Llamando a la versión std::nothrow_t
.
Su enlace de MSDN habla de la existencia de 'nothrow', pero * que * nunca estuvo en ninguna duda. Es * 'delete' * que todo el mundo te dice que no tiene la versión' nothrow', y tienen razón. –
Si ese libro es el de Schildt, debería (desafortunadamente) tirarlo. Ese tipo es terrible, y no tiene idea de qué está hablando cuando se trata del idioma. – GManNickG