Al leer las respuestas a this question noté que las respuestas (this por ejemplo) implican que se puede llamar a operator delete
incluso cuando la sentencia delete
se ejecuta en un puntero nulo.¿Por qué se invoca "operador delete" cuando llamo "eliminar" en un puntero nulo?
Así que escribí un pequeño fragmento:
class Test {
public:
void* operator new(size_t) { /*doesn't matter*/ return 0; }
void operator delete(void* ptr) {
ptr; //to suppress warning and have a line to put breakpoint on
}
};
int main()
{
Test* ptr = 0;
delete ptr;
}
y - sorprendentemente para mí - Test::operator delete()
se invoca con ptr
sosteniendo un puntero nulo.
Según tengo entendido, operator new
asigna memoria y operator delete
devuelve la memoria al asignador. Si llamo a la instrucción delete
en un puntero nulo, significa que no había ningún objeto detrás del puntero y que no hay memoria para regresar al asignador.
delete
declaración incluye invocar un destructor. Cuando paso un puntero nulo, el destructor seguramente no se invoca; C++ se ocupa de eso. Entonces, ¿por qué se invoca operator delete
en este caso?
Pregunte también por qué se invoca 'operator new' cuando asigna una matriz de longitud cero:' new Test [0]; '...;) – ybungalobill
@ybungalobill: Eso es más fácil: el estándar requiere que el puntero devuelto sea válido y distinto . – sharptooth
Tenga en cuenta que si convierte el destructor en virtual, no se invocará la sobrecarga 'operator delete'. Las implementaciones generalmente invocan la función directamente desde el destructor y llaman al destructor sin una comprobación de nulo (guardando algunas instrucciones). Solo cuando la llamada necesita despacho virtual es el cheque realizado por adelantado. – avakar