logo

malloc() vs nou în C++

Amandoua malloc() și noi în C++ sunt folosite în același scop. Ele sunt folosite pentru alocarea memoriei în timpul rulării. Dar, malloc() și new au o sintaxă diferită. Principala diferență dintre malloc() și new este că new este un operator, în timp ce malloc() este o funcție standard de bibliotecă care este predefinită într-un stdlib fișier antet.

Ce mai e nou?

Noul este un operator de alocare a memoriei, care este folosit pentru a aloca memoria în timpul rulării. Memoria inițializată de noul operator este alocată într-un heap. Returnează adresa de pornire a memoriei, care este atribuită variabilei. Funcționalitatea noului operator în C++ este similară cu funcția malloc(), care a fost folosită în limbaj de programare C . C++ este compatibil și cu funcția malloc(), dar noul operator este folosit mai ales datorită avantajelor sale.

Sintaxa operatorului nou

listă șir de caractere java
 type variable = new type(parameter_list); 

În sintaxa de mai sus

tip: Acesta definește tipul de date al variabilei pentru care memoria este alocată de noul operator.

variabil: Este numele variabilei care indică către memorie.

lista_parametri: Este lista de valori care sunt inițializate la o variabilă.

Noul operator nu folosește operatorul sizeof() pentru a aloca memoria. De asemenea, nu utilizează redimensionarea deoarece noul operator alocă suficientă memorie pentru un obiect. Este un construct care apelează constructorul în momentul declarației pentru a inițializa un obiect.

După cum știm că noul operator alocă memoria într-un heap; dacă memoria nu este disponibilă într-un heap și noul operator încearcă să aloce memoria, atunci excepția este aruncată. Dacă codul nostru nu este capabil să gestioneze excepția, atunci programul va fi terminat anormal.

Să înțelegem noul operator printr-un exemplu.

 #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<<>

Unde,

tip: este tipul de date al variabilei pentru care trebuie alocată memoria.

hashing în structura datelor

nume_variabilă: Acesta definește numele variabilei care indică către memorie.

(tip*): Este folosit pentru tipărire, astfel încât să putem obține pointerul unui tip specificat care indică către memorie.

dimensiunea(): Operatorul sizeof() este utilizat în funcția malloc() pentru a obține dimensiunea memoriei necesară pentru alocare.

Notă: Funcția malloc() returnează indicatorul void, astfel încât tipul este necesar pentru a atribui un tip diferit indicatorului. Operatorul sizeof() este necesar în funcția malloc() deoarece funcția malloc() returnează memoria brută, astfel încât operatorul sizeof() va spune funcției malloc() câtă memorie este necesară pentru alocare.

Dacă memoria suficientă nu este disponibilă, atunci memoria poate fi redimensionată folosind funcția realloc(). După cum știm că toate cerințele de memorie dinamică sunt îndeplinite folosind memoria heap, așadar funcția malloc() alocă și memoria într-un heap și returnează pointerul la aceasta. Memoria heap este foarte limitată, așa că atunci când codul nostru începe execuția, marchează memoria în uz, iar când codul nostru își finalizează sarcina, atunci eliberează memoria folosind funcția free(). Dacă memoria suficientă nu este disponibilă, iar codul nostru încearcă să acceseze memoria, atunci funcția malloc() returnează pointerul NULL. Memoria care este alocată de funcția malloc() poate fi dealocată folosind funcția free().

Să înțelegem printr-un exemplu.

 #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++)>

În codul de mai sus, apelăm funcția func(). Funcția func() returnează pointerul întreg. În cadrul funcției func(), am declarat un pointer *p, iar memoria este alocată acestei variabile pointer folosind funcția malloc(). În acest caz, returnăm indicatorul a cărui memorie este deja eliberată. ptr-ul este un pointer atârnător, deoarece indică locația de memorie eliberată. Sau putem spune că ptr se referă la acea memorie care nu este indicată de indicator.

Până acum, cunoaștem noul operator și funcția malloc(). Acum, vom vedea diferențele dintre noul operator și funcția malloc().

Diferențele dintre malloc() și new

malloc() vs nou în C++
  • Noul operator construiește un obiect, adică cheamă constructorul pentru a inițializa un obiect în timp ce malloc() funcția nu cheamă constructorul. Noul operator invocă constructorul, iar operatorul delete invocă destructorul pentru a distruge obiectul. Aceasta este cea mai mare diferență dintre malloc() și new.
  • New este un operator, în timp ce malloc() este o funcție predefinită în fișierul antet stdlib.
  • Operatorul new poate fi supraîncărcat în timp ce funcția malloc() nu poate fi supraîncărcată.
  • Dacă memoria suficientă nu este disponibilă într-un heap, atunci noul operator va lansa o excepție în timp ce funcția malloc() returnează un pointer NULL.
  • În noul operator, trebuie să specificăm numărul de obiecte care urmează să fie alocate, în timp ce în funcția malloc(), trebuie să specificăm numărul de octeți care trebuie alocați.
  • În cazul unui operator nou, trebuie să folosim operatorul de ștergere pentru a dealoca memoria. Dar în cazul funcției malloc(), trebuie să folosim funcția free() pentru a dealoca memoria.

Sintaxa operatorului nou

 type reference_variable = new type name; 

Unde,

tip: Acesta definește tipul de date al variabilei de referință.

referință_variabilă: Este numele variabilei pointer.

nou: Este un operator folosit pentru alocarea memoriei.

programare r in c

nume tip: Poate fi orice tip de date de bază.

De exemplu,

 int *p; p = new int; 

În declarațiile de mai sus, declarăm o variabilă tip pointer întreg. Declaratia p = int nou; alocă spațiul de memorie pentru o variabilă întreagă.

Sintaxa lui malloc() este dată mai jos:

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

ptr: Este o variabilă pointer.

tip_date: Poate fi orice tip de date de bază.

De exemplu,

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

Declarația de mai sus va aloca memoria pentru o variabilă întreagă într-un heap și apoi stochează adresa memoriei rezervate în variabila „p”.

  • Pe de altă parte, memoria alocată folosind funcția malloc() poate fi dealocată folosind funcția free().
  • Odată ce memoria este alocată folosind noul operator, atunci nu poate fi redimensionată. Pe de altă parte, memoria este alocată folosind funcția malloc(); apoi, poate fi realocat folosind funcția realloc().
  • Timpul de execuție al lui new este mai mic decât al funcției malloc() deoarece new este un construct, iar malloc este o funcție.
  • Noul operator nu returnează variabila pointer separată; returnează adresa obiectului nou creat. Pe de altă parte, funcția malloc() returnează pointerul void care poate fi tipificat în continuare într-un tip specificat.