2009-12-25 9 views
10

This MSDN page menziona che ci sono versioni nothrow di new e delete. nothrow new è una cosa abbastanza nota: restituisce null invece di generare un'eccezione se l'allocazione della memoria fallisce. Ma che cos'è lo nothrow delete menzionato qui?Cosa è nothrow delete in C++?

risposta

18

Probabilmente si riferiscono alle funzioni di allocazione della memoria non elaborata operator new e operator delete.

Quando si richiama una versione specifica di nuova collocazione espressione (cioè nuova espressione con parametri extra, ma tutti sono ufficialmente indicati come posizionamento forme di new) e la funzione di allocazione di memoria operator new riesce, ma il processo non riesce in seguito per qualche altro motivo (il costruttore lancia), l'implementazione deve interrompere il processo e rilasciare automaticamente la memoria allocata chiamando la versione appropriata di operator delete. "Versione appropriata" di operator delete in questo caso è la versione con lo stesso set di parametri della funzione operator new precedentemente utilizzata per l'allocazione di memoria (ad eccezione del primo parametro, ovviamente).

Si applica anche alla versione di operator new. Quando si utilizza una forma di espressione nuova nothrow, si chiama una versione di operator new e quindi si costruisce l'oggetto nella memoria allocata. Se il costruttore non riesce (genera), l'implementazione delle versioni di nuova espressione ha allocato la memoria con l'aiuto della versione nothrow di operator delete. Questo è fondamentalmente l'unica ragione per cui esiste questa versione di operator delete.

In altre parole, la versione nothrow di operator delete esiste per scopi interni molto specifici. Normalmente non dovresti chiamarlo da te e, forse, non hai davvero bisogno di sapere della sua esistenza. Tuttavia, vale la pena sapere che per le ragioni sopra descritte, ogni volta che crei la tua versione di operator new con parametri aggiuntivi, è sempre consigliabile fornire una versione corrispondente di operator delete con lo stesso set di parametri aggiuntivi.