[Notas de C ++] Errores comunes en el uso de punteros C / C ++

El puntero en C / C ++ da a los programadores más flexibilidad, pero también es un arma de doble filo. Si no lo usa bien, causará varios problemas en su programa. Algunas personas dicen: Los programadores de C / C ++ gastan la mitad de su carga de trabajo en solucionar los errores causados ​​por los punteros Uno puede imaginar lo terribles que son las trampas contenidas en los punteros. Siendo ese el caso, deberíamos comprobarlo cuando escribimos código.

Si desea evitar los problemas causados ​​por los punteros tanto como sea posible al escribir código, necesita saber qué problemas pueden ser causados ​​por el uso inadecuado de los punteros y cómo evitarlos. Resumamos los problemas que son fáciles de encontrar al usar punteros.

Evita pérdidas de memoria

El programa necesita memoria cuando se está ejecutando. Al mismo tiempo, también sabemos que la memoria es limitada, lo cual es un recurso particularmente valioso de la computadora. La memoria usada debe ser devuelta al sistema operativo a tiempo.

En c / c ++, si hay memoria en la pila (por ejemplo, variables locales no estáticas en una función), después de su uso, el sistema operativo la reclamará automáticamente para nosotros; pero si es memoria en el montón obtenida mediante asignación dinámica, Necesitamos liberarlo manualmente.

Si olvidamos liberar esta memoria dinámica en el programa, y ​​el programa es un proceso de servicio que continuará ejecutándose, hará que el uso de la memoria sea cada vez mayor.

En una palabra, si la memoria que ya no se usa no se libera, se denomina pérdida de memoria y el problema de la pérdida de memoria es muy grave. Bien, veamos algunos casos de pérdida de memoria.

En C / C ++, la memoria dinámica asignada por las funciones de asignación de memoria dinámica (como las funciones del sistema malloc) o el nuevo operador debe liberarse manualmente después de su uso. De lo contrario, provocará pérdidas de memoria.
[Notas de C ++] Errores comunes en el uso de punteros C / C ++

Sugerencia: preste atención al uso de malloc / free, new / delete en pares al escribir código

Incluso si se llama a free / delete para liberar la memoria después de malloc / new, es posible que la instrucción free / delete que libera la memoria no se ejecute debido a excepciones y se producirán pérdidas de memoria, como ocurre en el siguiente ejemplo.
[Notas de C ++] Errores comunes en el uso de punteros C / C ++

[Notas de C ++] Errores comunes en el uso de punteros C / C ++
A partir de los resultados de la ejecución, el destructor de la clase no se ejecuta y se puede inferir que la declaración de eliminación no se ejecuta.
Algunas personas dirán que esto no es fácil, simplemente agregue delete t después de la declaración catch cout << "Algo salió mal" << endl;
Así es, esto es solo un programa de prueba con docenas de líneas de código. Puede ver el problema de un vistazo, pero si se enfrenta a un proyecto enorme, creo que debe romperse el corazón. Existe una mejor manera de resolver este problema, es decir, punteros inteligentes, que se presentarán en un artículo especial más adelante.
Recomendación: preste más atención al uso de punteros inteligentes en el código C ++

No uses punteros salvajes

Los punteros salvajes también se denominan punteros colgantes, que son punteros a la memoria "basura". El uso de "punteros salvajes" hará que el programa muestre un comportamiento incierto.

Tenga en cuenta que los punteros salvajes no son punteros NULL. Son más propensos a cometer errores que los punteros NULL porque no pueden evitarse con sentencias de juicio de la forma if (NULL == p). Solo podemos prestar más atención al escribir código.

Una vez que el puntero p está libre o eliminado, no se establece en NULL, lo que hace que la gente piense erróneamente que p es un puntero válido. De hecho, free o delete solo libera la memoria apuntada por el puntero, pero el valor del puntero sigue siendo la dirección de esta memoria. Es solo que esta memoria ha sido recuperada y no puede ser reutilizada por el proceso El siguiente ejemplo es un caso típico de uso de punteros salvajes.
[Notas de C ++] Errores comunes en el uso de punteros C / C ++
[Notas de C ++] Errores comunes en el uso de punteros C / C ++

Sugerencia: establezca el puntero correspondiente en NULL después de liberar o eliminar

Olvidé inicializar al crear la variable de puntero p. El valor de p es un valor de basura aleatorio. En este momento, es peligroso leer y escribir el puntero y el programa producirá un comportamiento incierto.
[Notas de C ++] Errores comunes en el uso de punteros C / C ++
[Notas de C ++] Errores comunes en el uso de punteros C / C ++

Sugerencia: intente inicializar al definir variables de puntero, incluso si la inicialización es NULL

En c / c ++, las variables locales se almacenan en la pila. Su característica es que se crea cuando se llama a la función y se destruye cuando la función finaliza. Por lo tanto, la dirección de la variable local se asigna a un puntero en el programa después del retorno, y el puntero apunta a Un recuerdo que ha sido recuperado también es una especie de puntero salvaje.
Eche un vistazo al siguiente ejemplo. Originalmente quería devolver la dirección de la variable i en la función divertida ap, y usar p para acceder a esta variable. Esto imprime que * p es 32767, no el valor de la variable i. Estos errores son difíciles de localizar una vez que aparecen en un proyecto grande.
[Notas de C ++] Errores comunes en el uso de punteros C / C ++
[Notas de C ++] Errores comunes en el uso de punteros C / C ++

Sugerencia: No devuelva la dirección de una variable local en una función. Si la lógica del código debe ser la dirección de una variable local, entonces la variable local debe declararse como estática, porque la vida útil de una variable estática es todo el período de ejecución del programa.

No use punteros NULL

Todo el mundo sabe que no puede usar punteros NULL en programas, pero si no presta atención, aún puede usar punteros NULL en programas de forma inesperada.Aquí hay dos ejemplos que son propensos a problemas.

Cuando la función de asignación de memoria dinámica asigna memoria, es posible que no lo haga. En este momento, se devuelve NULL.
[Notas de C ++] Errores comunes en el uso de punteros C / C ++
[Notas de C ++] Errores comunes en el uso de punteros C / C ++
Desde el resultado de ejecución del programa, la asignación de malloc falla y devuelve NULL ap, y luego accede al contenido de la memoria en la dirección 0 señalada por p. Error "Fallo de segmentación".

Sugerencia: Cuando use la función de asignación de memoria para asignar memoria, debe usar if (p == NULL) o if (p! = NULL) para la prevención de errores.

Además, en las funciones que contienen parámetros de puntero, los punteros NULL también se pueden usar incorrectamente. El puntero pasado al llamar a la función es un puntero nulo. Si no hay una condición de juicio if (p! = NULL), entonces el puntero se usará más tarde El problema será grande, el siguiente ejemplo es esta situación.
[Notas de C ++] Errores comunes en el uso de punteros C / C ++
[Notas de C ++] Errores comunes en el uso de punteros C / C ++

Sugerencia: Para funciones que contienen parámetros de puntero, if (p == NULL) o if (p! = NULL) debe usarse en la entrada de la función para la prevención de errores.

Lectura recomendada:

Cuidadosamente organizado | El catálogo de artículos
en la segunda mitad de 2017 Comprender profundamente el mecanismo de registro en el sistema (Parte 2)
[Notas de C ++] Comprender el doble significado del nombre de tipo
[Notas de C ++] Diseño de memoria del modelo de objetos de C ++ (2)

Céntrese en compartir resumen de conocimientos de pila de tecnología de fondo del servidor

Bienvenido a prestar atención a la comunicación y al progreso común.

[Notas de C ++] Errores comunes en el uso de punteros C / C ++

Codificación

¡El productor de códigos tiene la manera correcta de proporcionarle artículos técnicos fáciles de entender para facilitar la tecnología!

Supongo que te gusta

Origin blog.51cto.com/15006953/2552121
Recomendado
Clasificación