En un par de mis proyectos de código anteriores cuando nunca había oído hablar de punteros inteligentes, cada vez que tenía que comprobar si el puntero aún apuntaba a un objeto válido, siempre lo hacía algo como esto ...Nullptr y comprobar si un puntero apunta a un objeto válido
object * meh = new object;
if(meh)
meh->member;
O cuando necesitaba para eliminar el objeto con seguridad, algo como esto
if(meh)
{
delete meh;
meh = 0;
}
Bueno, ahora he aprendido acerca de los problemas que pueden surgir del uso de objetos y punteros en expresiones booleanas ambas con números literales, de la manera difícil:. Y ahora también he aprendido de la característica no tan nueva pero genial de C++, la palabra clave nullptr
. Pero ahora tengo curiosidad.
que ya han pasado por y revisado la mayor parte de mi código de manera que, por ejemplo, al eliminar objetos que ahora escribo
if(meh)
{
delete meh;
meh = nullptr;
}
Ahora me pregunto sobre el booleano. Cuando se pasa simplemente decir un int en una sentencia if como esta,
int meh;
if(meh)
Entonces implícitamente cheques por cero sin necesidad de que escribirlo.
if(meh == 0) // does the exact same check
Ahora, ¿C++ hará lo mismo con los punteros? Si pasa un char * como este a una declaración if?
char * meh;
if(meh)
¿Entonces lo comparará implícitamente con nullptr? Debido a cuánto tiempo he estado escribiendo estos ifs de esta manera, en este momento es una segunda naturaleza verificar si los punteros son válidos antes de usar escribiendo (objeto *) y luego llamando a sus miembros. Si esta no es la funcionalidad, ¿por qué no? Demasiado difícil de implementar? Resolvería algunos problemas al eliminar otra forma más pequeña de desordenar tu código.
No ** necesita ** punteros de ckeck antes de 'borrar'. Es completamente seguro 'eliminar' un' nullptr'. –
En su último ejemplo, ¿quiso decir 'char * meh = nullptr; si (meh) '? El puntero no está inicializado. –
El resultado de su expresión 'new' nunca será nulo, en su lugar se usan excepciones. Como se mencionó, eliminar null está bien, no hace nada. Además, generalmente es mejor no restablecer el valor de un puntero a nulo. La última vez que se utiliza debe ser la última vez que no es nulo, por lo que tener acceso a un puntero eliminado se debe considerar un error; establecerlo en null oculta eso. – GManNickG