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; }
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