class Widget
{
public:
Widget() {
cout<<"~Widget()"<<endl;
}
~Widget() {
cout<<"~Widget()"<<endl;
}
void* operator new(size_t sz) throw(bad_alloc) {
cout<<"operator new"<<endl;
throw bad_alloc();
}
void operator delete(void *v) {
cout<<"operator delete"<<endl;
}
};
int main()
{
Widget* w = 0;
try {
w = new Widget();
}
catch(bad_alloc) {
cout<<"Out of Memory"<<endl;
}
delete w;
getch();
return 1;
}
En este código, delete w
no llama a la delete
operador sobrecargado cuando el destructor está allí. Si se omite el destructor, se llama al delete
sobrecargado. ¿Por qué esto es tan?eliminar un puntero NULL no llama sobrecargado eliminar al destructor está escrito
Salida cuando ~ Widget() se escribe
operador nueva
fuera de la memoria
Salida cuando ~ Widget() no está escrito
operador nuevo
Sin memoria
operador eliminar
¡Esta es una pregunta extrañamente fascinante! Acabo de buscar en Effective C++ de Scott Meyer (desafortunadamente solo tengo 2nd Ed) y no pude ver nada sobre esto. –