Både malloc() och ny i C++ används för samma ändamål. De används för att allokera minne vid körning. Men malloc() och new har olika syntax. Huvudskillnaden mellan malloc() och new är att den nya är en operator medan malloc() är en standardbiblioteksfunktion som är fördefinierad i en stdlib header-fil.
Vad är nytt?
Det nya är en minnesallokeringsoperator, som används för att allokera minnet vid körning. Minnet som initierats av den nya operatören allokeras i en hög. Den returnerar startadressen för minnet, som tilldelas variabeln. Funktionaliteten för den nya operatorn i C++ liknar malloc()-funktionen, som användes i C programmeringsspråk . C++ är också kompatibel med malloc()-funktionen, men den nya operatorn används mest på grund av dess fördelar.
Syntax för ny operator
type variable = new type(parameter_list);
I ovanstående syntax
typ: Den definierar datatypen för variabeln för vilken minnet är allokerat av den nya operatören.
variabel: Det är namnet på variabeln som pekar på minnet.
parameter_list: Det är listan med värden som initieras till en variabel.
Den nya operatorn använder inte operatorn sizeof() för att allokera minnet. Den använder inte heller storleksändringen eftersom den nya operatören allokerar tillräckligt med minne för ett objekt. Det är en konstruktion som anropar konstruktören vid tidpunkten för deklarationen för att initiera ett objekt.
Som vi vet att den nya operatören allokerar minnet i en hög; om minnet inte är tillgängligt i en hög och den nya operatören försöker allokera minnet, då kastas undantaget. Om vår kod inte kan hantera undantaget kommer programmet att avslutas på ett onormalt sätt.
Låt oss förstå den nya operatören genom ett exempel.
#include using namespace std; int main() { int *ptr; // integer pointer variable declaration ptr=new int; // allocating memory to the pointer variable ptr. std::cout << 'Enter the number : ' <>*ptr; std::cout << 'Entered number is ' <<*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's understand through an example.</strong> </p> <pre> #include #include using namespace std; int main() { int len; // variable declaration std::cout << 'Enter the count of numbers :' <> 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 << 'Entered elements are : ' << 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'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 'p' 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<<>
var,
typ: det är datatypen för variabeln som minnet måste allokeras för.
variabelnamn: Den definierar namnet på variabeln som pekar på minnet.
(typ*): Den används för typcasting så att vi kan få pekaren av en specificerad typ som pekar på minnet.
sql välj som
storlek av(): Operatorn sizeof() används i malloc()-funktionen för att erhålla den minnesstorlek som krävs för allokeringen.
Obs: Funktionen malloc() returnerar void-pekaren, så typcasting krävs för att tilldela en annan typ till pekaren. Operatorn sizeof() krävs i malloc()-funktionen eftersom malloc()-funktionen returnerar råminnet, så operatorn sizeof() kommer att tala om för malloc()-funktionen hur mycket minne som krävs för allokeringen.
Om tillräckligt med minne inte är tillgängligt kan minnet storleksändras med hjälp av realloc()-funktionen. Eftersom vi vet att alla dynamiska minneskrav är uppfyllda med hjälp av heap-minne, så allokerar malloc()-funktionen också minnet i en heap och returnerar pekaren till den. Högminnet är mycket begränsat, så när vår kod börjar köras markerar den minnet som används, och när vår kod slutför sin uppgift frigör den minnet genom att använda free()-funktionen. Om tillräckligt med minne inte är tillgängligt och vår kod försöker komma åt minnet, returnerar malloc()-funktionen NULL-pekaren. Minnet som allokeras av malloc()-funktionen kan avallokeras genom att använda free()-funktionen.
Låt oss förstå genom ett exempel.
#include #include using namespace std; int main() { int len; // variable declaration std::cout << 'Enter the count of numbers :' <> 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 << 'Entered elements are : ' << 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'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 'p' 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++)>
I ovanstående kod anropar vi func()-funktionen. Funktionen func() returnerar heltalspekaren. Inuti func()-funktionen har vi deklarerat en *p-pekare, och minnet allokeras till denna pekarvariabel med malloc()-funktionen. I det här fallet returnerar vi pekaren vars minne redan är släppt. Ptr är en dinglande pekare när den pekar på den frigjorda minnesplatsen. Eller så kan vi säga att ptr syftar på det minnet som inte pekas av pekaren.
Tills nu får vi veta om den nya operatorn och malloc()-funktionen. Nu kommer vi att se skillnaderna mellan den nya operatorn och malloc()-funktionen.
Skillnader mellan malloc() och new
- Den nya operatören konstruerar ett objekt, dvs den anropar konstruktorn för att initialisera ett objekt medan malloc() funktion anropar inte konstruktorn. Den nya operatorn anropar konstruktorn och delete-operatorn anropar förstöraren för att förstöra objektet. Detta är den största skillnaden mellan malloc() och new.
- Den nya är en operator, medan malloc() är en fördefinierad funktion i stdlib-huvudfilen.
- Operatören new kan överbelastas medan malloc()-funktionen inte kan överbelastas.
- Om tillräckligt med minne inte är tillgängligt i en heap, kommer den nya operatorn att skapa ett undantag medan malloc()-funktionen returnerar en NULL-pekare.
- I den nya operatorn måste vi ange antalet objekt som ska tilldelas medan vi i malloc()-funktionen måste ange antalet byte som ska tilldelas.
- I fallet med en ny operatör måste vi använda operatören delete för att avallokera minnet. Men när det gäller malloc()-funktionen måste vi använda free()-funktionen för att deallokera minnet.
Syntax för ny operator
type reference_variable = new type name;
var,
typ: Den definierar datatypen för referensvariabeln.
referensvariabel: Det är namnet på pekarvariabeln.
ny: Det är en operatör som används för att allokera minnet.
typnamn: Det kan vara vilken grundläggande datatyp som helst.
Till exempel,
int *p; p = new int;
I ovanstående uttalanden deklarerar vi en heltalspekarvariabel. Påståendet p = ny int; allokerar minnesutrymmet för en heltalsvariabel.
Syntaxen för malloc() ges nedan:
int *ptr = (data_type*) malloc(sizeof(data_type));
ptr: Det är en pekarvariabel.
data typ: Det kan vara vilken grundläggande datatyp som helst.
Till exempel,
int *p; p = (int *) malloc(sizeof(int))
Ovanstående sats kommer att allokera minnet för en heltalsvariabel i en hög, och lagrar sedan adressen till det reserverade minnet i variabeln 'p'.
- Å andra sidan kan minnet som allokeras med malloc()-funktionen avallokeras med hjälp av free()-funktionen.
- När minnet väl har allokerats med den nya operatorn kan det inte ändras i storlek. Å andra sidan allokeras minnet med funktionen malloc(); sedan kan den omfördelas med realloc()-funktionen.
- Exekveringstiden för new är mindre än malloc()-funktionen eftersom new är en konstruktion och malloc är en funktion.
- Den nya operatorn returnerar inte den separata pekarvariabeln; den returnerar adressen till det nyskapade objektet. Å andra sidan returnerar malloc()-funktionen void-pekaren som kan typcastas ytterligare i en specificerad typ.
*ptr<<>