Error doble libre o corrupción

Error doble libre o corrupción
El error de doble libre o corrupción en C ++ significa que nuestro programa invoca de alguna manera el objeto Free () C ++ con una variable de puntero ilegal. Cuando usamos punteros inteligentes como shared_ptr, debemos verificar porque si llamamos a la función get (), estamos usando directamente el puntero sin procesar. Planeamos asignar esto a un puntero inteligente para una referencia continua. Esta corrupción es la causa raíz del bloqueo del código. Usamos la función gratuita () para dislocar la memoria de montón típicamente. La memoria del montón ha utilizado principalmente la función de nuestro sistema operativo para administrar las ubicaciones de memoria. Así que aquí está el error cuando nuestro código no posee este puntero hasta que copiemos el código.

Cuando el puntero es nulo:

Aquí solo mostramos nuestra función gratuita () cómo funciona al principio; Incluimos bibliotecas y estándares del espacio de nombres e iniciamos el cuerpo principal del código inicializó la variable entera y también inicializamos un puntero con el nulo para evitar el error de doble libre o corrupción y otros punteros tienen el valor de nuestro entero. Luego usamos la instrucción if-else para verificar el puntero nulo y el puntero que tiene nuestro valor entero. Después de la condición, llamamos a nuestra función para reasignar nuestro puntero.

#incluir
usando el espacio de nombres STD;
int main ()

int x = 5;
int *ptr1 = null;
int *ptr2 = & x;
if (ptr1)

cout << "Pointer is not Null" << endl;

demás

cout << "Pointer is Null" << endl;

gratis (ptr1);
cout << *ptr2;

Tras la ejecución, la salida se verá así:

Cómo es que se acumule:

Esto se acumula si el puntero está utilizando la asignación de memoria o llamando a la función Free () en C ++ directamente a veces a veces. También podría acumularse cuando Free () se llama como argumento a la misma ubicación de memoria una o más de una vez. La estructura de datos de administración de memoria del código se ha corrompido o no puede permitir que un usuario final sospechoso ingrese los valores en una ubicación de memoria aleatoria. Si un código llama a la función gratuita () con la misma ubicación de memoria más de una vez.

Además, si eliminamos la misma entrada dos veces y eliminamos algo que no se asignó en el montón de memoria. Por lo tanto, los punteros son la causa directa de este error.

#incluir
#incluir
#incluir
int main ()
std :: vector vec 0, 1, 2;
std :: vector:: iterator it = std :: max_element (vec.begin (), vec.fin());
std :: vector vec2 3, 4, 5;
VEC.insertar (VEC.end (), vec2.begin (), vec2.fin());
VEC.Bórralo);
para (auto & n: vec)
std :: cout << n << std::endl;

Primero, integramos tres bibliotecas de encabezado; Uno es #include, en la biblioteca de plantillas estándar, es una clase de plantilla en el lenguaje de programación. Es un contenedor de secuencia que guarda elementos. Se utiliza principalmente para admitir los datos dinámicos en el lenguaje de programación C ++. Podemos expandir los vectores, pero depende de los elementos que contienen estos vectores junto con ellos.
El segundo archivo de encabezado es #include que nos proporciona muchas funcionalidades que podrían ser para muchos fines, como clasificar el elemento, admitir algoritmo de búsqueda, multiplicar los valores, contar variables, etc. Por último, pero no menos importante, ese es el #Clude ese propósito es admitir nuestro flujo de entrada-salida. Después de las bibliotecas, comenzamos nuestro cuerpo principal donde usamos estándares con los vectores y asignamos variables que tienen un tipo de datos enteros y asignamos valores a esta variable.

Aquí está nuestra declaración en la que asignamos nuestra variable junto con su inicio y punto final a través de la función maz_element. Repita nuevamente la declaración, pero cambiamos nuestros valores a otra variable esta vez. Luego usamos la función de inserción y pasamos los parámetros que son el punto final de nuestra variable anterior, el punto de inicio de la segunda variable y el punto final de la variable. La función ERASE () se usa para borrar un solo elemento del vector y también se usa para modificar el tamaño del vector. Por fin, usamos para el bucle con el límite de nuestra primera variable, y en el bucle, mostramos la variable que inicializamos en nuestro bucle.

Como evitar:

Podemos evitar este tipo de vulnerabilidad; siempre debemos asignar nulo a nuestro puntero cuando se vuelve gratuito. La mayoría de los gerentes de Heap ignoraron los punteros nulos gratuitos posteriormente. Esta es la mejor práctica que anulamos todos los punteros eliminados, así como también debemos establecer una verificación si el puntero es nulo o no antes de liberar el puntero. Debemos inicializar el puntero nulo al inicio de nuestro código. Como cuando intentamos usar la declaración Cout (STD :: Cout).

#incluir
usando el espacio de nombres STD;
int main ()

int * i = new int ();
eliminar i;
cout<cout<<"\npointer delete successfully";
eliminar i;
cout<regresar 0;

El archivo de encabezado está incluido. Luego escribimos usando el estándar de espacio de nombres y comenzamos el cuerpo del programa principal. Inicializamos el puntero con el tipo de datos enteros. Aquí asignamos nulo al puntero e imprimimos el puntero. Después de asignar el NULL, eliminamos el puntero e imprimimos el mensaje de éxito. Por fin, nuevamente revisamos nuestro puntero, y puede ver que no existe un puntero en nuestro montón de memoria.

Conclusión:

En este artículo, describimos brevemente el error doble libre o corrupción. Luego hemos reasignado nuestra memoria utilizando nuestra función () y discutimos las causas del error y utilizamos el ejemplo de la función borrado (). Al final, hemos proporcionado una solución una solución simple y lógica a este error de una manera muy fácil.