Obaja malloc() a nové v C++ sa používajú na rovnaký účel. Používajú sa na prideľovanie pamäte za behu. Ale malloc() a new majú inú syntax. Hlavný rozdiel medzi malloc() a new je v tom, že new je operátor, zatiaľ čo malloc() je štandardná knižničná funkcia, ktorá je preddefinovaná v stdlib hlavičkový súbor.
Čo je nové?
Novinkou je operátor prideľovania pamäte, ktorý sa používa na prideľovanie pamäte za behu. Pamäť inicializovaná operátorom new je alokovaná v halde. Vracia počiatočnú adresu pamäte, ktorá je priradená k premennej. Funkcionalita operátora new v C++ je podobná funkcii malloc(), ktorá bola použitá v C programovací jazyk . C++ je kompatibilný aj s funkciou malloc(), ale nový operátor sa väčšinou používa kvôli jeho výhodám.
Syntax nového operátora
type variable = new type(parameter_list);
Vo vyššie uvedenej syntaxi
typ: Definuje dátový typ premennej, pre ktorú je novým operátorom pridelená pamäť.
premenná: Je to názov premennej, ktorá ukazuje na pamäť.
zoznam_parametrov: Je to zoznam hodnôt, ktoré sú inicializované do premennej.
Operátor new nepoužíva na alokáciu pamäte operátor sizeof(). Tiež nepoužíva zmenu veľkosti, pretože operátor new prideľuje objektu dostatok pamäte. Je to konštrukcia, ktorá volá konštruktor v čase deklarácie na inicializáciu objektu.
10 percent zo 60
Ako vieme, nový operátor alokuje pamäť do hromady; ak pamäť nie je dostupná v halde a nový operátor sa pokúsi alokovať pamäť, potom sa vyvolá výnimka. Ak náš kód nie je schopný spracovať výnimku, potom bude program abnormálne ukončený.
Poďme pochopiť nového operátora na príklade.
#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<<>
kde,
typ: je to dátový typ premennej, pre ktorú musí byť alokovaná pamäť.
názov_premennej: Definuje názov premennej, ktorá ukazuje na pamäť.
(typ*): Používa sa na pretypovanie, aby sme mohli získať ukazovateľ zadaného typu, ktorý ukazuje na pamäť.
veľkosť(): Operátor sizeof() sa používa vo funkcii malloc() na získanie veľkosti pamäte potrebnej na alokáciu.
Poznámka: Funkcia malloc() vracia ukazovateľ void, takže na priradenie iného typu k ukazovateľu je potrebné pretypovanie. Operátor sizeof() sa vyžaduje vo funkcii malloc(), pretože funkcia malloc() vracia surovú pamäť, takže operátor sizeof() povie funkcii malloc() koľko pamäte je potrebné na pridelenie.
Ak nie je k dispozícii dostatok pamäte, veľkosť pamäte sa dá zmeniť pomocou funkcie realloc(). Keďže vieme, že všetky požiadavky na dynamickú pamäť sú splnené pomocou haldy pamäte, funkcia malloc() tiež alokuje pamäť do haldy a vráti na ňu ukazovateľ. Pamäť haldy je veľmi obmedzená, takže keď sa náš kód spustí, označí používanú pamäť a keď náš kód dokončí svoju úlohu, uvoľní pamäť pomocou funkcie free(). Ak nie je k dispozícii dostatok pamäte a náš kód sa pokúsi získať prístup k pamäti, funkcia malloc() vráti ukazovateľ NULL. Pamäť, ktorá je pridelená funkciou malloc() môže byť uvoľnená pomocou funkcie free().
Poďme to pochopiť na príklade.
nevýhody online bankovníctva
#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++)>
Vo vyššie uvedenom kóde voláme funkciu func(). Funkcia func() vracia celočíselný ukazovateľ. Vo funkcii func() sme deklarovali *p ukazovateľ a pamäť je pridelená tejto premennej ukazovateľa pomocou funkcie malloc(). V tomto prípade vraciame ukazovateľ, ktorého pamäť je už uvoľnená. Ptr je visiaci ukazovateľ, pretože ukazuje na miesto uvoľnenej pamäte. Alebo môžeme povedať, že ptr odkazuje na tú pamäť, na ktorú neukazuje ukazovateľ.
Doteraz sme sa dozvedeli o novom operátorovi a funkcii malloc(). Teraz uvidíme rozdiely medzi novým operátorom a funkciou malloc().
Rozdiely medzi malloc() a new
- Operátor new vytvorí objekt, t.j. zavolá konštruktor, aby inicializoval objekt malloc() funkcia nevolá konštruktor. Operátor new vyvolá konštruktor a operátor vymazania vyvolá deštruktor na zničenie objektu. Toto je najväčší rozdiel medzi malloc() a new.
- Nový je operátor, zatiaľ čo malloc() je preddefinovaná funkcia v hlavičkovom súbore stdlib.
- Operátor new môže byť preťažený, zatiaľ čo funkcia malloc() nemôže byť preťažená.
- Ak v halde nie je k dispozícii dostatok pamäte, operátor new vyvolá výnimku, zatiaľ čo funkcia malloc() vráti ukazovateľ NULL.
- V operátori new musíme zadať počet objektov, ktoré sa majú prideliť, zatiaľ čo vo funkcii malloc() musíme zadať počet bajtov, ktoré sa majú prideliť.
- V prípade nového operátora musíme na uvoľnenie pamäte použiť operátor delete. Ale v prípade funkcie malloc() musíme na uvoľnenie pamäte použiť funkciu free().
Syntax nového operátora
type reference_variable = new type name;
kde,
typ: Definuje typ údajov referenčnej premennej.
referenčná_premenná: Je to názov premennej ukazovateľa.
Nový: Je to operátor používaný na prideľovanie pamäte.
názov typu: Môže to byť akýkoľvek základný typ údajov.
Napríklad,
int *p; p = new int;
Vo vyššie uvedených príkazoch deklarujeme premennú celočíselného ukazovateľa. Výkaz p = new int; alokuje pamäťový priestor pre celočíselné premenné.
Syntax malloc() je uvedená nižšie:
int *ptr = (data_type*) malloc(sizeof(data_type));
ptr: Je to ukazovateľová premenná.
vlk vs líška
Dátový typ: Môže to byť akýkoľvek základný typ údajov.
Napríklad,
int *p; p = (int *) malloc(sizeof(int))
Vyššie uvedený príkaz pridelí pamäť celočíselnej premennej do haldy a potom uloží adresu vyhradenej pamäte do premennej „p“.
- Na druhej strane, pamäť alokovaná pomocou funkcie malloc() môže byť uvoľnená pomocou funkcie free().
- Po pridelení pamäte pomocou operátora new nie je možné zmeniť jej veľkosť. Na druhej strane je pamäť alokovaná pomocou funkcie malloc(); potom ho možno prerozdeliť pomocou funkcie realloc().
- Čas vykonania new je kratší ako funkcia malloc(), pretože new je konštrukt a malloc je funkcia.
- Operátor new nevracia samostatnú premennú ukazovateľa; vráti adresu novovytvoreného objektu. Na druhej strane funkcia malloc() vracia ukazovateľ void, ktorý možno ďalej pretypovať na špecifikovaný typ.
*ptr<<>