Compartir tecnología

Explicación sobre el problema indefinido de mezclar eliminar y eliminar []

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Sabemos que eliminar se usa para liberar un espacio dinámico y eliminar [] se usa para liberar múltiples espacios dinámicos, pero ¿qué problemas ocurrirán si los mezclamos? He leído muchos artículos en el blog, pero no son satisfactorios, así que escribí este artículo para que sepas qué es y por qué (Una explicación superficial, corríjanme.)。

---------------------------------------------------------------------------------------------------------------------------------

Primero podemos ver un ejemplo:

El resultado de ejecución es:

Pero si no escribimos el destructor explícitamente:

El resultado es un funcionamiento normal:

---------------------------------------------------------------------------------------------------------------------------------

¿por qué?

Si le pregunto cuánto espacio asigna el sistema a estos 10 objetos de Clase A, lo más probable es que responda 40 bytes.Es fácil de entender. Una A tiene 4 bytes y 10 tiene 40 bytes. .Pero, de hecho, si escribe el destructor usted mismo, se asignarán un total de 44 bytes. Si no escribe un destructor, se asignarán un total de 40 bytes.

¿Por qué hay 4 bytes más después de escribir el destructor? Sabemos que después de usar eliminar para liberar este espacio, se llamará automáticamente al destructor (http://t.csdnimg.cn/f2FOj), (1) Si escribimos el destructor nosotros mismos, eliminar necesita llamarlo (De hecho, eliminar también es una función, lo que equivale a una llamada anidada de la función.), entonces cuántas veces se llama es una pregunta. Estos cuatro bytes tienen exactamente el tamaño de un número entero. Este número entero se utiliza para registrar la cantidad de objetos en este espacio, determinando así cuántas veces deben llamarse el constructor y el destructor. llamado.Sin embargo, debe saber que el puntero p todavía apunta al primer objeto, pero avanzará para obtener la cantidad de objetos durante la construcción y destrucción., la relación específica es la siguiente:

(2) Si no escribimos un destructor en este momento, llamará al destructor generado por el compilador sin registrar el número de veces (puede implicar un nivel inferior, no estoy seguro, corríjame), y no es necesario abrir una cirugía plástica adicional.

Bien, ahora puedes explicar el ejemplo anterior.

Eliminar libera espacio de la posición señalada por el puntero de forma predeterminada; eliminar[] primero verifica si se abre más espacio de forma predeterminada y, de ser así, mueve el puntero una posición hacia adelante antes de soltarlo. Si abre más espacio o usa eliminar para liberar el espacio, entonces el espacio abierto no se puede liberar, lo que provoca una pérdida de memoria, por lo que se informa un error.

¿Recibiré un error si practico esto? :

No es necesario llamar al destructor, no es necesario contar el número de objetos y no es necesario abrir más espacio. Por lo tanto, el espacio se puede liberar desde la posición señalada por el puntero, por lo que no se producirá ningún error. informó.

Hay muchas situaciones, puedes bajar y probarlo tú mismo.

Me falta la capacidad de expresarme. Léelo varias veces y definitivamente ganarás algo.