logo

malloc() vs nuevo en C++

Ambos malloc() y new en C++ se utilizan para el mismo propósito. Se utilizan para asignar memoria en tiempo de ejecución. Pero malloc() y new tienen una sintaxis diferente. La principal diferencia entre malloc() y new es que new es un operador, mientras que malloc() es una función de biblioteca estándar que está predefinida en un biblioteca estándar archivo de cabecera.

¿Qué es nuevo?

El nuevo es un operador de asignación de memoria, que se utiliza para asignar memoria en tiempo de ejecución. La memoria inicializada por el nuevo operador se asigna en un montón. Devuelve la dirección inicial de la memoria, que se asigna a la variable. La funcionalidad del operador new en C++ es similar a la función malloc(), que se usó en el lenguaje de programación c . C++ También es compatible con la función malloc(), pero el operador new se utiliza principalmente debido a sus ventajas.

Sintaxis del nuevo operador

recorrido en orden del árbol binario
 type variable = new type(parameter_list); 

En la sintaxis anterior

tipo: Define el tipo de datos de la variable para la cual el nuevo operador asigna la memoria.

variable: Es el nombre de la variable que apunta a la memoria.

lista_parámetros: Es la lista de valores que se inicializan en una variable.

El nuevo operador no utiliza el operador sizeof() para asignar la memoria. Tampoco utiliza el cambio de tamaño ya que el nuevo operador asigna suficiente memoria para un objeto. Es una construcción que llama al constructor en el momento de la declaración para inicializar un objeto.

Como sabemos, el nuevo operador asigna la memoria en un montón; si la memoria no está disponible en un montón y el nuevo operador intenta asignar la memoria, se lanza la excepción. Si nuestro código no puede manejar la excepción, el programa finalizará de manera anormal.

Entendamos al nuevo operador a través de un ejemplo.

 #include using namespace std; int main() { int *ptr; // integer pointer variable declaration ptr=new int; // allocating memory to the pointer variable ptr. std::cout &lt;&lt; &apos;Enter the number : &apos; &lt;&gt;*ptr; std::cout &lt;&lt; &apos;Entered number is &apos; &lt;<*ptr<< std::endl; return 0; } < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c.webp" alt="malloc() vs new in C++"> <h3>What is malloc()?</h3> <p>A malloc() is a function that allocates memory at the runtime. This function returns the void pointer, which means that it can be assigned to any pointer type. This void pointer can be further typecast to get the pointer that points to the memory of a specified type.</p> <p>The syntax of the malloc() function is given below:</p> <pre> type variable_name = (type *)malloc(sizeof(type)); </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> it is the datatype of the variable for which the memory has to be allocated.</p> <p> <strong>variable_name:</strong> It defines the name of the variable that points to the memory.</p> <p> <strong>(type*):</strong> It is used for typecasting so that we can get the pointer of a specified type that points to the memory.</p> <p> <strong>sizeof():</strong> The sizeof() operator is used in the malloc() function to obtain the memory size required for the allocation.</p> <h4>Note: The malloc() function returns the void pointer, so typecasting is required to assign a different type to the pointer. The sizeof() operator is required in the malloc() function as the malloc() function returns the raw memory, so the sizeof() operator will tell the malloc() function how much memory is required for the allocation.</h4> <p>If the sufficient memory is not available, then the memory can be resized using realloc() function. As we know that all the dynamic memory requirements are fulfilled using heap memory, so malloc() function also allocates the memory in a heap and returns the pointer to it. The heap memory is very limited, so when our code starts execution, it marks the memory in use, and when our code completes its task, then it frees the memory by using the free() function. If the sufficient memory is not available, and our code tries to access the memory, then the malloc() function returns the NULL pointer. The memory which is allocated by the malloc() function can be deallocated by using the free() function.</p> <p> <strong>Let&apos;s understand through an example.</strong> </p> <pre> #include #include using namespace std; int main() { int len; // variable declaration std::cout &lt;&lt; &apos;Enter the count of numbers :&apos; &lt;&gt; len; int *ptr; // pointer variable declaration ptr=(int*) malloc(sizeof(int)*len); // allocating memory to the poiner variable for(int i=0;i<len;i++) { std::cout << 'enter a number : ' <> *(ptr+i); } std::cout &lt;&lt; &apos;Entered elements are : &apos; &lt;&lt; std::endl; for(int i=0;i<len;i++) { std::cout << *(ptr+i) std::endl; } free(ptr); return 0; < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-2.webp" alt="malloc() vs new in C++"> <p>If we do not use the <strong>free()</strong> function at the correct place, then it can lead to the cause of the dangling pointer. <strong>Let&apos;s understand this scenario through an example.</strong> </p> <pre> #include #include using namespace std; int *func() { int *p; p=(int*) malloc(sizeof(int)); free(p); return p; } int main() { int *ptr; ptr=func(); free(ptr); return 0; } </pre> <p>In the above code, we are calling the func() function. The func() function returns the integer pointer. Inside the func() function, we have declared a *p pointer, and the memory is allocated to this pointer variable using malloc() function. In this case, we are returning the pointer whose memory is already released. The ptr is a dangling pointer as it is pointing to the released memory location. Or we can say ptr is referring to that memory which is not pointed by the pointer.</p> <p>Till now, we get to know about the new operator and the malloc() function. Now, we will see the differences between the new operator and the malloc() function.</p> <h3>Differences between the malloc() and new</h3> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-3.webp" alt="malloc() vs new in C++"> <ul> <li>The new operator constructs an object, i.e., it calls the constructor to initialize an object while <strong>malloc()</strong> function does not call the constructor. The new operator invokes the constructor, and the delete operator invokes the destructor to destroy the object. This is the biggest difference between the malloc() and new.</li> <li>The new is an operator, while malloc() is a predefined function in the stdlib header file.</li> <li>The operator new can be overloaded while the malloc() function cannot be overloaded.</li> <li>If the sufficient memory is not available in a heap, then the new operator will throw an exception while the malloc() function returns a NULL pointer.</li> <li>In the new operator, we need to specify the number of objects to be allocated while in malloc() function, we need to specify the number of bytes to be allocated.</li> <li>In the case of a new operator, we have to use the delete operator to deallocate the memory. But in the case of malloc() function, we have to use the free() function to deallocate the memory.</li> </ul> <p> <strong>Syntax of new operator</strong> </p> <pre> type reference_variable = new type name; </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> It defines the data type of the reference variable.</p> <p> <strong>reference_variable:</strong> It is the name of the pointer variable.</p> <p> <strong>new:</strong> It is an operator used for allocating the memory.</p> <p> <strong>type name:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = new int; </pre> <p>In the above statements, we are declaring an integer pointer variable. The statement <strong>p = new int;</strong> allocates the memory space for an integer variable.</p> <p> <strong>Syntax of malloc() is given below:</strong> </p> <pre> int *ptr = (data_type*) malloc(sizeof(data_type)); </pre> <p> <strong>ptr:</strong> It is a pointer variable.</p> <p> <strong>data_type:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = (int *) malloc(sizeof(int)) </pre> <p>The above statement will allocate the memory for an integer variable in a heap, and then stores the address of the reserved memory in &apos;p&apos; variable.</p> <ul> <li>On the other hand, the memory allocated using malloc() function can be deallocated using the free() function.</li> <li>Once the memory is allocated using the new operator, then it cannot be resized. On the other hand, the memory is allocated using malloc() function; then, it can be reallocated using realloc() function.</li> <li>The execution time of new is less than the malloc() function as new is a construct, and malloc is a function.</li> <li>The new operator does not return the separate pointer variable; it returns the address of the newly created object. On the other hand, the malloc() function returns the void pointer which can be further typecast in a specified type.</li> </ul> <hr></len;i++)></len;i++)></pre></*ptr<<>

dónde,

tipo: es el tipo de datos de la variable para la que se debe asignar memoria.

nombre de la variable: Define el nombre de la variable que apunta a la memoria.

(tipo*): Se utiliza para encasillar para que podamos obtener el puntero de un tipo específico que apunte a la memoria.

tamaño de(): El operador sizeof() se utiliza en la función malloc() para obtener el tamaño de memoria requerido para la asignación.

Nota: La función malloc() devuelve el puntero nulo, por lo que se requiere encasillamiento para asignar un tipo diferente al puntero. El operador sizeof() es necesario en la función malloc() ya que la función malloc() devuelve la memoria sin procesar, por lo que el operador sizeof() le indicará a la función malloc() cuánta memoria se requiere para la asignación.

Si no hay suficiente memoria disponible, entonces se puede cambiar el tamaño de la memoria usando la función realloc(). Como sabemos, todos los requisitos de memoria dinámica se cumplen utilizando la memoria del montón, por lo que la función malloc() también asigna la memoria en un montón y le devuelve el puntero. La memoria del montón es muy limitada, por lo que cuando nuestro código comienza a ejecutarse, marca la memoria en uso y cuando nuestro código completa su tarea, libera la memoria usando la función free(). Si no hay suficiente memoria disponible y nuestro código intenta acceder a la memoria, entonces la función malloc() devuelve el puntero NULL. La memoria asignada por la función malloc() se puede desasignar utilizando la función free().

Entendamos a través de un ejemplo.

 #include #include using namespace std; int main() { int len; // variable declaration std::cout &lt;&lt; &apos;Enter the count of numbers :&apos; &lt;&gt; len; int *ptr; // pointer variable declaration ptr=(int*) malloc(sizeof(int)*len); // allocating memory to the poiner variable for(int i=0;i<len;i++) { std::cout << \'enter a number : \' <> *(ptr+i); } std::cout &lt;&lt; &apos;Entered elements are : &apos; &lt;&lt; std::endl; for(int i=0;i<len;i++) { std::cout << *(ptr+i) std::endl; } free(ptr); return 0; < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-2.webp" alt="malloc() vs new in C++"> <p>If we do not use the <strong>free()</strong> function at the correct place, then it can lead to the cause of the dangling pointer. <strong>Let&apos;s understand this scenario through an example.</strong> </p> <pre> #include #include using namespace std; int *func() { int *p; p=(int*) malloc(sizeof(int)); free(p); return p; } int main() { int *ptr; ptr=func(); free(ptr); return 0; } </pre> <p>In the above code, we are calling the func() function. The func() function returns the integer pointer. Inside the func() function, we have declared a *p pointer, and the memory is allocated to this pointer variable using malloc() function. In this case, we are returning the pointer whose memory is already released. The ptr is a dangling pointer as it is pointing to the released memory location. Or we can say ptr is referring to that memory which is not pointed by the pointer.</p> <p>Till now, we get to know about the new operator and the malloc() function. Now, we will see the differences between the new operator and the malloc() function.</p> <h3>Differences between the malloc() and new</h3> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-3.webp" alt="malloc() vs new in C++"> <ul> <li>The new operator constructs an object, i.e., it calls the constructor to initialize an object while <strong>malloc()</strong> function does not call the constructor. The new operator invokes the constructor, and the delete operator invokes the destructor to destroy the object. This is the biggest difference between the malloc() and new.</li> <li>The new is an operator, while malloc() is a predefined function in the stdlib header file.</li> <li>The operator new can be overloaded while the malloc() function cannot be overloaded.</li> <li>If the sufficient memory is not available in a heap, then the new operator will throw an exception while the malloc() function returns a NULL pointer.</li> <li>In the new operator, we need to specify the number of objects to be allocated while in malloc() function, we need to specify the number of bytes to be allocated.</li> <li>In the case of a new operator, we have to use the delete operator to deallocate the memory. But in the case of malloc() function, we have to use the free() function to deallocate the memory.</li> </ul> <p> <strong>Syntax of new operator</strong> </p> <pre> type reference_variable = new type name; </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> It defines the data type of the reference variable.</p> <p> <strong>reference_variable:</strong> It is the name of the pointer variable.</p> <p> <strong>new:</strong> It is an operator used for allocating the memory.</p> <p> <strong>type name:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = new int; </pre> <p>In the above statements, we are declaring an integer pointer variable. The statement <strong>p = new int;</strong> allocates the memory space for an integer variable.</p> <p> <strong>Syntax of malloc() is given below:</strong> </p> <pre> int *ptr = (data_type*) malloc(sizeof(data_type)); </pre> <p> <strong>ptr:</strong> It is a pointer variable.</p> <p> <strong>data_type:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = (int *) malloc(sizeof(int)) </pre> <p>The above statement will allocate the memory for an integer variable in a heap, and then stores the address of the reserved memory in &apos;p&apos; variable.</p> <ul> <li>On the other hand, the memory allocated using malloc() function can be deallocated using the free() function.</li> <li>Once the memory is allocated using the new operator, then it cannot be resized. On the other hand, the memory is allocated using malloc() function; then, it can be reallocated using realloc() function.</li> <li>The execution time of new is less than the malloc() function as new is a construct, and malloc is a function.</li> <li>The new operator does not return the separate pointer variable; it returns the address of the newly created object. On the other hand, the malloc() function returns the void pointer which can be further typecast in a specified type.</li> </ul> <hr></len;i++)></len;i++)>

En el código anterior, llamamos a la función func(). La función func() devuelve el puntero entero. Dentro de la función func(), hemos declarado un puntero *p y la memoria se asigna a esta variable de puntero usando la función malloc(). En este caso, devolvemos el puntero cuya memoria ya está liberada. El ptr es un puntero colgante que apunta a la ubicación de la memoria liberada. O podemos decir que ptr se refiere a esa memoria a la que no apunta el puntero.

Hasta ahora, conocemos el nuevo operador y la función malloc(). Ahora veremos las diferencias entre el nuevo operador y la función malloc().

Diferencias entre malloc() y new

malloc() vs nuevo en C++
  • El nuevo operador construye un objeto, es decir, llama al constructor para inicializar un objeto mientras malloc() La función no llama al constructor. El nuevo operador invoca al constructor y el operador de eliminación invoca al destructor para destruir el objeto. Esta es la mayor diferencia entre malloc() y new.
  • New es un operador, mientras que malloc() es una función predefinida en el archivo de encabezado stdlib.
  • El operador new se puede sobrecargar mientras que la función malloc() no se puede sobrecargar.
  • Si no hay suficiente memoria disponible en un montón, entonces el nuevo operador generará una excepción mientras que la función malloc() devuelve un puntero NULL.
  • En el nuevo operador, debemos especificar la cantidad de objetos que se asignarán, mientras que en la función malloc(), debemos especificar la cantidad de bytes que se asignarán.
  • En el caso de un operador nuevo, tenemos que usar el operador de eliminación para desasignar la memoria. Pero en el caso de la función malloc(), tenemos que usar la función free() para desasignar la memoria.

Sintaxis del nuevo operador

 type reference_variable = new type name; 

dónde,

tipo: Define el tipo de datos de la variable de referencia.

variable_referencia: Es el nombre de la variable puntero.

nuevo: Es un operador utilizado para asignar la memoria.

matriz de cadenas en lenguaje c

escribe un nombre: Puede ser cualquier tipo de datos básico.

Por ejemplo,

 int *p; p = new int; 

En las declaraciones anteriores, declaramos una variable de puntero entero. La declaración p = nuevo int; Asigna el espacio de memoria para una variable entera.

La sintaxis de malloc() se proporciona a continuación:

 int *ptr = (data_type*) malloc(sizeof(data_type)); 

ptr: Es una variable de puntero.

tipo de datos: Puede ser cualquier tipo de datos básico.

Por ejemplo,

 int *p; p = (int *) malloc(sizeof(int)) 

La declaración anterior asignará la memoria para una variable entera en un montón y luego almacenará la dirección de la memoria reservada en la variable 'p'.

  • Por otro lado, la memoria asignada mediante la función malloc() se puede desasignar mediante la función free().
  • Una vez que la memoria se asigna utilizando el nuevo operador, no se puede cambiar su tamaño. Por otro lado, la memoria se asigna mediante la función malloc(); luego, se puede reasignar usando la función realloc().
  • El tiempo de ejecución de new es menor que el de la función malloc() ya que new es una construcción y malloc es una función.
  • El nuevo operador no devuelve la variable de puntero separada; devuelve la dirección del objeto recién creado. Por otro lado, la función malloc() devuelve el puntero vacío que puede encasillarse aún más en un tipo específico.