/Zc:throwingNew (Presuppone la generazione dell'operatore new)
Quando si specifica l'opzione /Zc:throwingNew , il compilatore ottimizza le chiamate a operator new
per ignorare i controlli per restituire un puntatore Null. Questa opzione indica al compilatore di presupporre che tutte le implementazioni collegate di operator new
e gli allocatori personalizzati siano conformi allo standard C++ e generino un errore di allocazione. Per impostazione predefinita in Visual Studio, il compilatore genera in modo pessimistico controlli Null (/Zc:throwingNew-) per queste chiamate, perché gli utenti possono collegarsi a un'implementazione non generata di operator new
o scrivere routine di allocatore personalizzate che restituiscono puntatori Null.
Sintassi
/Zc:throwingNew[-]
Osservazioni:
A partire da ISO C++98, lo standard ha specificato che l'operatore predefinito new genera std::bad_alloc
quando l'allocazione della memoria non riesce. Le versioni di Visual C++ fino a Visual Studio 6.0 hanno restituito un puntatore Null in un errore di allocazione. A partire da Visual Studio 2002, operator new
è conforme allo standard e genera un errore. Per supportare il codice che usa lo stile di allocazione precedente, Visual Studio fornisce un'implementazione collegabile di operator new
in nothrownew.obj che restituisce un puntatore Null in caso di errore. Per impostazione predefinita, il compilatore genera anche controlli Null difensivi per impedire a questi allocatori di stile precedente di causare un arresto anomalo immediato in caso di errore. L'opzione /Zc:throwingNew indica al compilatore di escludere questi controlli Null, presupponendo che tutti gli allocatori di memoria collegata siano conformi allo standard. Ciò non si applica agli overload espliciti che non generano operator new
, che vengono dichiarati usando un parametro aggiuntivo di tipo std::nothrow_t
e hanno una specifica esplicita noexcept
.
Concettualmente, per creare un oggetto nell'archivio gratuito, il compilatore genera il codice per allocare la memoria e quindi richiamare il relativo costruttore per inizializzare la memoria. Poiché il compilatore MSVC in genere non è in grado di stabilire se questo codice verrà collegato a un allocatore non conforme e non generato, per impostazione predefinita genera anche un controllo Null prima di chiamare il costruttore. In questo modo si impedisce una dereferenziazione del puntatore Null nella chiamata al costruttore se un'allocazione non generata ha esito negativo. Nella maggior parte dei casi, questi controlli non sono necessari, perché gli allocatori predefiniti operator new
generano invece di restituire puntatori Null. I controlli hanno anche effetti collaterali sfortunati. Inondano le dimensioni del codice, inondano il predictor del ramo e impediscono altre utili ottimizzazioni del compilatore, ad esempio la devirtualizzazione o la propagazione const dall'oggetto inizializzato. I controlli esistono solo per supportare il codice collegato a nothrownew.obj o con implementazioni personalizzate non conformi operator new
. Se non si usa un codice non conforme operator new
, è consigliabile usare /Zc:throwingNew per ottimizzare il codice.
L'opzione /Zc:throwingNew è disattivata per impostazione predefinita e non è interessata dall'opzione /permissive- .
Se si esegue la compilazione usando la generazione di codice in fase di collegamento (LTCG), non è necessario specificare /Zc:throwingNew. Quando il codice viene compilato tramite LTCG, il compilatore può rilevare se viene usata l'implementazione operator new
predefinita conforme. In tal caso, il compilatore esce automaticamente dai controlli Null. Il linker cerca il flag /ThrowingNew per indicare se l'implementazione di operator new
è conforme. È possibile specificare questo flag per il linker includendo questa direttiva nell'origine per la nuova implementazione dell'operatore personalizzato:
#pragma comment(linker, "/ThrowingNew")
Per altre informazioni sui problemi di conformità in Visual C++, vedere Nonstandard Behavior.
Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio
Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.
Dal menu a discesa Configurazione scegliere Tutte le configurazioni.
Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.
Modificare la proprietà Opzioni aggiuntive per includere /Zc:throwingNew o /Zc:throwingNew- e quindi scegliere OK.
Vedi anche
Opzioni del compilatore MSVC
Sintassi della riga di comando del compilatore MSVC
/Zc (conformità)
noexcept (C++)
Specifiche di eccezioni (generazione) (C++)
terminate (eccezione)