new vs malloc() y free() vs delete en C++

Usamos operadores new y delete en C++ para asignar memoria dinámicamente, mientras que las funciones malloc() y free() también se usan para el mismo propósito en C y C++. La funcionalidad de new o malloc() y delete o free() parece ser la misma pero difieren en varios aspectos.
El comportamiento con respecto a las llamadas a constructores y destructores difiere de las siguientes maneras:
malloc() vs new(): 

  • malloc(): es una función de biblioteca de C que también se puede usar en C++, mientras que el operador «nuevo» es específico solo para C++. 
     
  • Tanto malloc() como new se utilizan para asignar la memoria dinámicamente en el montón. Pero “nuevo” llama al constructor de una clase mientras que “malloc()” no lo hace.

A continuación se muestra el programa para ilustrar la funcionalidad de new y malloc(): 

CPP

// C++ program to illustrate malloc()
// and new operator in C++
#include "bits/stdc++.h"
using namespace std;
 
// Class A
class A {
    int a;
 
public:
    int* ptr;
 
    // Constructor of class A
    A()
    {
        cout << "Constructor was Called!"
             << endl;
    }
};
 
// Driver Code
int main()
{
 
    // Create an object of class A
    // using new operator
    A* a = new A;
    cout << "Object of class A was "
         << "created using new operator!"
         << endl;
 
    // Create an object of class A
    // using malloc operator
    A* b = (A*)malloc(sizeof(A));
    cout << "Object of class A was "
         << "created using malloc()!"
         << endl;
 
    return 0;
}
Producción: 

Constructor was Called!
Object of class A was created using new operator!
Object of class A was created using malloc()!

 

En el programa anterior, podemos ver claramente que al crear un objeto usando un nuevo operador, se llamó al Constructor predeterminado y no se llamó al usar la función malloc.
libre() frente a eliminar: 

  • free() es una función de biblioteca de C que también se puede usar en C++, mientras que “delete” es una palabra clave de C++.
  • free() libera memoria pero no llama al Destructor de una clase mientras que “delete” libera la memoria y también llama al Destructor de la clase.

A continuación se muestra el programa para ilustrar la funcionalidad de new y malloc():

CPP

// C++ program to illustrate free()
// and delete keyword in C++
#include "bits/stdc++.h"
using namespace std;
 
// Class A
class A {
    int a;
 
public:
    int* ptr;
 
    // Constructor of class A
    A()
    {
        cout << "Constructor was Called!"
             << endl;
    }
 
    // Destructor of class A
    ~A()
    {
        cout << "Destructor was Called!"
             << endl;
    }
};
 
// Driver Code
int main()
{
 
    // Create an object of class A
    // using new operator
    A* a = new A;
    cout << "Object of class A was "
         << "created using new operator!"
         << endl;
 
    delete (a);
    cout << "Object of class A was "
         << "deleted using delete keyword!"
         << endl;
 
    cout << endl;
 
    A* b = (A*)malloc(sizeof(A));
    cout << "Object of class A was "
         << "created using malloc()!"
         << endl;
 
    free(b);
    cout << "Object of class A was "
         << "deleted using free()!"
         << endl;
 
    return 0;
}
Producción: 

Constructor was Called!
Object of class A was created using new operator!
Destructor was Called!
Object of class A was deleted using delete keyword!

Object of class A was created using malloc()!
Object of class A was deleted using free()!

 

A continuación se muestran los programas para más ilustraciones:
Programa 1: 

CPP

// C++ program to illustrate new, delete
// malloc() and free()
#include "bits/stdc++.h"
using namespace std;
 
// Class A
class A {
    int a;
 
public:
    int* ptr;
 
    // Constructor of class A
    A()
    {
        cout << "Constructor was Called!"
             << endl;
    }
 
    // Destructor of class A
    ~A()
    {
        cout << "Destructor was Called!"
             << endl;
    }
};
 
// Driver Code
int main()
{
 
    // Object Created of class A
    A a;
    return 0;
}
Producción: 

Constructor was Called!
Destructor was Called!

 

En el programa anterior, se sigue llamando al destructor aunque no se utilice el operador de eliminación. El motivo de la llamada al destructor es la declaración «return 0» . Esta instrucción, cuando se ejecuta dentro de la función principal, llama al destructor de cada clase para la que se creó el objeto.
Para evitar la llamada de Destructor, podemos reemplazar la declaración «return 0» con «exit (0)». A continuación se muestra el código para el mismo:
Programa 2: 

CPP

// C++ program to illustrate new, delete
// malloc() and free()
#include "bits/stdc++.h"
using namespace std;
 
// Class A
class A {
    int a;
 
public:
    int* ptr;
 
    // Constructor of class A
    A()
    {
        cout << "Constructor was Called!"
             << endl;
    }
 
    // Destructor of class A
    ~A()
    {
        cout << "Destructor was Called!"
             << endl;
    }
};
 
// Driver Code
int main()
{
 
    // Object Created of class A
    A a;
    exit(0);
}
Producción: 

Constructor was Called!

 

Programa 3: 

CPP

// C++ program to illustrate new, delete
// malloc() and free()
#include "bits/stdc++.h"
using namespace std;
 
// Class A
class A {
    int a;
 
public:
    int* ptr;
 
    // Constructor of class A
    A()
    {
        cout << "Constructor was Called!"
             << endl;
    }
 
    // Destructor of class A
    ~A()
    {
        cout << "Destructor was Called!"
             << endl;
    }
};
 
// Driver Code
int main()
{
 
    // Object Created of class A
    A *a = new A;
    return 0;
}
Producción: 

Constructor was Called!

 

No hay llamada de Destructor incluso después de usar la declaración «return 0» . La razón radica en la diferencia de asignar un objeto de una clase. Cuando creamos un objeto con class_name object_name dentro de un bloque se crea, el objeto tiene una duración de almacenamiento automático, es decir, se destruirá automáticamente al salir del alcance. Pero cuando usamos new class_name, el objeto tiene una duración de almacenamiento dinámica, lo que significa que uno tiene que eliminarlo explícitamente usando la palabra clave delete .

Publicación traducida automáticamente

Artículo escrito por shivamtripathi91 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 *