Encontré this one question asking the same thing, sin embargo, solo se respondió la parte 'nueva', así que aquí va otra vez.¿Por qué se requiere que el operador de eliminación sea estático?
¿Por qué se requiere que el operador de eliminación sea estático? De alguna manera no tiene sentido. El nuevo operador tiene mucho sentido, al igual que el constructor no puede ser virtual, como tampoco el nuevo operador. Sin embargo, el destructor puede (y debería) ser virtual cuando se usa la herencia, para permitir la destrucción de los objetos utilizados (por medio de polimorfismo) como una clase base.
Entiendo que, cuando se llama al operador delete, el objeto ya se ha destruido, por lo que no existe 'esto'. Sin embargo, sigue teniendo sentido utilizar el mismo razonamiento que con el destructor virtual para que el operador de eliminación coincida con el nuevo operador que creó el objeto.
Esto es lo que quiero decir
class A
{
public:
virtual ~A() {}
};
class B : public A
{
public:
void* operator new (size_t sz);
void operator delete (void* ptr, size_t sz);
};
ahora si hacemos operador delete
A *ptr = new B();
delete ptr; // <-- fail
de A (por defecto) debería haber sido llamados, ya que es estático y no se sabe (por cualquier cosa menos el caso trivial aquí) en tiempo de compilación, que delete-operator es el correcto.
Sin embargo, hice un pequeño programa de prueba con el código anterior (solo malloc/free en los operadores new/delete e print statement en delete) y lo compilé usando g ++. Ejecutarlo de manera inesperada produjo el resultado en el operador de eliminación de B.
Mi pregunta (real) es esta: ¿hay alguna 'virtualidad' implícita para el operador de eliminación? ¿Es solo estático en el sentido de no-puntero? ¿O es solo una característica de g ++?
Comencé a buscar a través de la especificación C++, pero debo admitir que me sentí abrumado por ella, por lo que cualquier ayuda apreciada.
Excelente, gracias! Estuve hurgando en 3.7.3 ... – falstro
También hay material relevante en 5.3.5 y 3.7.3 y 12.5. Aunque se considera una obra de referencia, parece que tienes que leerlo de principio a fin, de lo contrario nunca sabrías si hay un pequeño párrafo relevante para algo que estás buscando en una sección completamente diferente de donde eras en realidad mirando. –