Tengo una pregunta básica sobre los punteros const. No puedo llamar a ninguna función miembro que no sea constante usando un puntero constante. Sin embargo, puedo hacer esto en un puntero constante:
delete p;
Esto llamará al destructor de la clase que, en esencia, es un 'método' no constante. ¿Por qué está permitido esto? ¿Es solo para apoyar esto?
delete this;
¿O hay alguna otra razón?
c++
constants
delete-operator
Naveen
fuente
fuente
const Foo * f
oFoo const * f
no es un puntero constante para Foo. Es mejor const Foo.Foo * const f
es un puntero constante a Foo.Póngalo de esta manera: si no estuviera permitido, no habría forma de eliminar objetos const sin usar const_cast.
Semánticamente, const es una indicación de que un objeto debe ser inmutable. Sin embargo, eso no implica que el objeto no deba eliminarse.
fuente
Sí es usted.
class Foo { public: void aNonConstMemberFunction(); }; Foo* const aConstPointer = new Foo; aConstPointer->aNonConstMemberFunction(); // legal const Foo* aPointerToConst = new Foo; aPointerToConst->aNonConstMemberFunction(); // illegal
Ha confundido un puntero constante a un objeto no constante, con un puntero no constante a un objeto constante.
Una vez dicho esto,
delete aConstPointer; // legal delete aPointerToConst; // legal
es legal eliminar cualquiera de los dos, por las razones ya indicadas en las otras respuestas aquí.
fuente
Los constructores y destructores no deben verse como "métodos". Son construcciones especiales para inicializar y derribar un objeto de una clase.
'const pointer' es para indicar que el estado del objeto no cambiará cuando se realicen operaciones en él mientras está vivo.
fuente
Otra forma de verlo: el significado preciso de un puntero constante es que no podrá realizar cambios en el objeto señalado que sería visible a través de ese o cualquier otro puntero o referencia al mismo objeto. Pero cuando un objeto se destruye, todos los demás punteros a la dirección ocupada anteriormente por el objeto ahora eliminado ya no son punteros a ese objeto . Almacenan la misma dirección, pero esa dirección ya no es la dirección de ningún objeto (de hecho, es posible que pronto se reutilice como la dirección de un objeto diferente).
Esta distinción sería más obvia si los punteros en C ++ se comportaran como referencias débiles, es decir, tan pronto como se destruye el objeto, todos los punteros existentes se establecerían inmediatamente en
0
. (Ese es el tipo de cosas que se consideran demasiado costosas en tiempo de ejecución para imponerlas en todos los programas de C ++ y, de hecho, es imposible hacerlo completamente confiable).ACTUALIZACIÓN : Leyendo esto nueve años después, es como un abogado. Ahora encuentro comprensible su reacción original. No permitir la mutación pero permitir la destrucción es claramente problemático. El contrato implícito de punteros / referencias constantes es que su existencia actuará como un bloqueo en la destrucción del objeto de destino, también conocido como recolección automática de basura.
La solución habitual a esto es utilizar casi cualquier otro idioma.
fuente
std::unique_ptr<const T>
final de su vida?