A esiste una funzione di deallocazione std::nothrow_t
, ma non è possibile chiamarla con un'espressione delete
.
La funzione di deallocazione è lì per completezza. Se un'espressione new
non riesce a causa di un'eccezione, il compilatore deve liberare la memoria allocata tramite operator new
con una chiamata allo operator delete
. Quindi deve esserci un operator delete
che accetta uno std::nothrow_t
, per consentire questo.
(Cioè, in generale, un new
espressione con la forma new (args...) T
allocherà memoria con una chiamata a operator new(sizeof(T), args...)
. Per "match" significa chiamare operator delete
gli stessi argomenti, tranne la prima.)
Note puoi chiamare direttamente l'operatore: operator delete(memory, std::nothrow);
. Tuttavia, un'espressione delete
non chiama mai una funzione di deallocazione globale con parametri aggiuntivi.
Così si può "call" con:
struct always_throw
{
always_throw() { throw std::exception(); }
};
new (std::nothrow) always_throw;
Ad un certo punto, questo sarà allocare la memoria con una chiamata a:
void* __memory = operator new(sizeof(always_throw), std::nothrow);
Dal momento che l'inizializzazione dell'oggetto getta , il compilatore deve liberare la memoria allocata con una funzione di deallocazione corrispondente, così fa:
operator delete(__memory, std::nothrow);
Chiamare la versione std::nothrow_t
.
Il tuo link MSDN parla dell'esistenza di 'nothrow', ma * che * non ha mai avuto alcun dubbio. È * 'delete' * che tutti ti dicono che non ha la versione' nothrow', e hanno ragione. –
Se quel libro è quello di Schildt, dovresti (sfortunatamente) buttarlo via. Quel ragazzo è terribile e non ha idea di cosa stia parlando quando parla della lingua. – GManNickG