¿Por qué la gente piensa que los punteros son malos?

La gente no cree que los punteros sean malos. Si los punteros fueran malos, la mayoría de las computadoras digitales modernas serían malas, ya que la mayoría de ellas usan punteros en algunas de sus instrucciones de CPU. Un puntero es solo una variable que contiene una dirección de memoria. Es algo muy natural de tener y no es malo de ninguna manera.

Lo que algunas personas deberían pensar es que en los lenguajes como C ++, los punteros en bruto no siempre son necesarios, y solo deben usarse cuando sea necesario. Hay punteros inteligentes que envuelven los punteros sin procesar de una manera más fácil / segura de usar. Los punteros inteligentes correctamente implementados hacen que sea menos probable que se encuentren con errores como las pérdidas de memoria o el acceso a la memoria que ya estaba liberada y que ahora podría contener datos inesperados.

Dado que a las personas les gusta dramatizar las cosas para lograr un efecto, esto se ha convertido en “los punteros son malos”, como lo dicen algunas personas, algunas veces.

Las otras dos respuestas son buenas; El señor García es el más sucinto. El trasfondo de esta declaración es que los punteros y la administración de memoria manual _can_ resultan difíciles de encontrar errores que hacen que las aplicaciones de software se bloqueen. La probabilidad de estos tipos de bloqueos aumenta proporcionalmente con el tamaño del programa e inversamente proporcional con la experiencia del programador. Los punteros C son como tener armas sin dispositivos de seguridad. Debes tener cuidado en todo momento. Muchos programadores menos experimentados desean codificar rápidamente y tienden a hacer cosas peligrosas para ahorrar tiempo de codificación. “Lo haré seguro más tarde …”

¿Por qué entonces los programadores usarían punteros? Debido a que su uso es productivo para muchas tareas, es difícil o imposible hacerlo con otras construcciones de programación. Son básicos para los lenguajes de programación más antiguos, y su uso se relaciona con la forma en que la CPU accede a la memoria.

Incluso los mejores pistoleros han golpeado sus pies de vez en cuando, por lo que algunos lenguajes de programación modernos están intentando diseñar lenguajes que no te permiten apuntar a tus pies. Un ejemplo es el nuevo lenguaje Swift de Apple (que ahora es de código abierto). Algunos pistoleros dirían que no pueden verse obstaculizados por esto y supongo que el tiempo dirá quién tiene la razón. A pesar de que Swift no incluye elementos de puntero en el lenguaje en sí, el compilador subyacente utiliza punteros. Los arquitectos compiladores suelen ser personas muy brillantes y experimentadas:)

Como no soy tan inteligente, tiendo a gustarme los idiomas de nivel superior (más abstractos), pero a veces me gustan la velocidad y la eficiencia y, a veces, exploro las características lingüísticas de nivel inferior. Lo bueno es que las computadoras y los compiladores son mucho mejores (más rápidos) que hace 40 años, por lo que ser seguro da como resultado menos compromisos de rendimiento en la actualidad.

Sin embargo, los punteros no son malos.

El otro debate sobre la memoria es la maldad de la recolección de basura frente al conteo automático de referencias frente al conteo manual de referencias.