2012-11-21 12 views
7
#include <new> 
#include <cstdlib> 
#include <iostream> 
#include <stdexcept> 

struct foo {}; 

inline void* operator new(size_t size, foo*) throw (std::bad_alloc) 
{ 
    std::cout << "my new " << size << std::endl; 
    return malloc(size); 
} 

inline void operator delete(void* p, foo*) throw() 
{ 
    std::cout << "my delete" << std::endl; 
    free(p); 
} 

int main() 
{ 
    delete new((foo*)NULL) foo; 
} 

uscita (via ideone):sovraccarico new e delete operatore con argomenti opzionali

my new 1 

Il mio pensiero è che C++ avrebbe liberato un new'd oggetto con ulteriori discussioni con la sua corrispondenza eliminare degli stessi argomenti, ma ovviamente ero incorretto.

Qual è il modo corretto per ottenere il codice sopra per chiamare la mia eliminazione sovraccaricata?

+0

Non c'è espressione posizionamento cancellare in C++. Devi distruggere l'oggetto manualmente. –

risposta

8

Quando si utilizza qualsiasi forma di posizionamento nuova, tranne per le versioni std::nothrow_t, è necessario distruggere esplicitamente l'oggetto e rilasciare la memoria con qualsiasi mezzo si ritenga opportuno. La versione sovraccaricata di operator delete() è ancora necessaria per esistere, tuttavia, perché viene utilizzata se la costruzione dell'oggetto genera un'eccezione! In questo caso, nessun puntatore viene restituito perché viene generata un'eccezione. Liberarsi della memoria deve, quindi, essere fatto in questo processo di allocazione.

Cioè, si main() dovrebbe essere simile a questo:

int main() 
{ 
    foo* p = new (static_cast<foo*>(0)) foo; 
    p->~foo(); 
    operator delete(p, static_cast<foo*>(0)); 
}