una - eliminar valor de un vector c++
Eliminar objetos de tipo incompleto (3)
Del estándar [expr.delete]:
Si el objeto que se elimina tiene un tipo de clase incompleto en el punto de eliminación y la clase completa tiene un destructor no trivial o una función de desasignación, el comportamiento no está definido.
Entonces, es UB si hay cosas triviales que hacer, y está bien si no es así. Las advertencias no son necesarias para UB.
Este me hizo pensar:
class X;
void foo(X* p)
{
delete p;
}
¿Cómo podemos delete p
si ni siquiera sabemos si X
tiene un destructor visible? g ++ 4.5.1 proporciona tres advertencias:
warning: possible problem detected in invocation of delete operator: warning: ''p'' has incomplete type warning: forward declaration of ''struct X''
Y luego dice:
Nota: ni el destructor ni la eliminación del operador específico de la clase se invocarán, incluso si se declaran cuando se define la clase.
Wow ... ¿se requieren compiladores para diagnosticar esta situación como lo hace g ++? ¿O es un comportamiento indefinido?
Es un comportamiento indefinido, y un problema común cuando se implementa el patrón pImpl. Que yo sepa, simplemente no existe una advertencia que el compilador debe emitir. Las advertencias son electivas; están ahí porque el escritor del compilador pensó que serían útiles.
Es un comportamiento indefinido.
Sin embargo, puede hacer que el compilador compruebe si hay tipos incompletos, como boost:
// verify that types are complete for increased safety
template<class T> inline void checked_delete(T * x)
{
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete x;
}
Aplicar sizeof
a un tipo incompleto debería desencadenar un error, y supongo que si eso pasa con algún compilador, entonces una matriz de tamaño negativo provocaría un error.