¿Qué sucede si mezclamos lo nuevo y lo gratuito en C++?

Como sabemos, new se usa para crear memoria dinámicamente y es responsabilidad del programador eliminar la ubicación de la memoria explícitamente y se elimina utilizando la palabra clave delete . La sintaxis para crear memoria en tiempo de ejecución usando una nueva palabra clave:

int *ptr = nuevo int;

Creará una ubicación de memoria para el tipo int y devolverá su dirección. free() solo debe usarse para los punteros que apuntan a la memoria asignada mediante malloc() o para un puntero NULL.

¿Qué sucede si mezclamos lo nuevo y lo gratuito en C++?

Sabemos que la memoria creada por la nueva palabra clave se elimina con la palabra clave delete y la memoria creada por malloc() se elimina con free() . new llama al constructor y delete llama al destructor para la desasignación de memoria. Ahora, al crear memoria usando una nueva palabra clave e intentar eliminarla usando free() , entonces no se llamará al destructor y, debido a eso, la memoria y los recursos no estarán libres. Y conducirá a la fuga de memoria y recursos. A continuación se muestra el programa para analizar cómo se comporta free() y delete :

C++

// C++ program to illustrate the working
// of memory allocation if new and free
// are mixed
#include <iostream>
using namespace std;
  
class A {
private:
    int* p;
  
public:
    // Default Constructor
    A()
    {
        cout << "Constructor is executed"
             << endl;
        p = new int;
        *p = 5;
    }
  
    // Destructor
    ~A()
    {
        cout << "Destructor is executed"
             << endl;
        // resource clean-up
        cleanup();
    }
  
    // Member Function
    void cleanup()
    {
        cout << "Resource clean-"
             << "up completed" << endl;
    }
  
    // Function to display the value
    // of class variables
    void display()
    {
        cout << "value is: "
             << *p << endl;
    }
};
  
// Driver Code
int main()
{
    // Create Object of class A
    A* ptr = new A();
    ptr->display();
  
    // Destructor will be called
    delete ptr;
  
    A* ptr1 = new A();
    ptr1->display();
  
    // No destructor will be called
    // hence no resource clean-up
    free(ptr);
  
    return 0;
}
Producción:

Constructor is executed
value is: 5
Destructor is executed
Resource clean-up completed
Constructor is executed
value is: 5

Explicación :

En el código anterior, se crea un objeto usando una palabra clave nueva y estamos tratando de eliminar este objeto usando free() . No llamará al destructor para este objeto, y la memoria y los recursos de este objeto no se liberarán. Por lo tanto, siempre se sugiere evitar

Publicación traducida automáticamente

Artículo escrito por Yogesh Shukla 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *