logo

malloc() vs nowy w C++

Oboje malloc() i new w C++ są używane w tym samym celu. Służą do alokacji pamięci w czasie wykonywania. Ale malloc() i new mają inną składnię. Główna różnica między malloc() i new polega na tym, że new jest operatorem, natomiast malloc() jest standardową funkcją biblioteczną, która jest predefiniowana w stdlib plik nagłówkowy.

Co nowego?

Nowością jest operator alokacji pamięci, który służy do alokacji pamięci w czasie wykonywania. Pamięć zainicjowana przez operator new jest alokowana na stercie. Zwraca początkowy adres pamięci, który zostaje przypisany do zmiennej. Funkcjonalność operatora new w C++ jest podobna do funkcji malloc(), która została użyta w Język programowania C . C++ jest również kompatybilny z funkcją malloc(), ale operator new jest najczęściej używany ze względu na jego zalety.

Składnia nowego operatora

 type variable = new type(parameter_list); 

W powyższej składni

typ: Określa typ danych zmiennej, dla której operator new przydziela pamięć.

zmienny: Jest to nazwa zmiennej wskazującej na pamięć.

lista_parametrów: Jest to lista wartości, które są inicjowane jako zmienna.

Operator new nie używa operatora sizeof() do alokacji pamięci. Nie używa również zmiany rozmiaru, ponieważ operator new przydziela wystarczającą ilość pamięci dla obiektu. Jest to konstrukcja, która wywołuje konstruktor w momencie deklaracji w celu zainicjowania obiektu.

Ankita Dave

Jak wiemy, operator new przydziela pamięć na stercie; jeśli pamięć nie jest dostępna na stercie, a operator new próbuje przydzielić pamięć, zgłaszany jest wyjątek. Jeśli nasz kod nie będzie w stanie obsłużyć wyjątku, program zostanie nieprawidłowo zakończony.

Przyjrzyjmy się nowemu operatorowi na przykładzie.

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

Gdzie,

typ: jest to typ danych zmiennej, dla której należy przydzielić pamięć.

nazwa_zmiennej: Definiuje nazwę zmiennej wskazującej na pamięć.

(typ*): Służy do rzutowania typów, dzięki czemu możemy uzyskać wskaźnik określonego typu, który wskazuje na pamięć.

rozmiar(): Operator sizeof() jest używany w funkcji malloc() w celu uzyskania rozmiaru pamięci wymaganego do alokacji.

Uwaga: Funkcja malloc() zwraca wskaźnik void, więc do przypisania wskaźnikowi innego typu wymagane jest rzutowanie na typ. Operator sizeof() jest wymagany w funkcji malloc(), ponieważ funkcja malloc() zwraca surową pamięć, więc operator sizeof() poinformuje funkcję malloc(), ile pamięci potrzeba do alokacji.

Jeśli nie jest dostępna wystarczająca ilość pamięci, można zmienić jej rozmiar za pomocą funkcji realloc(). Ponieważ wiemy, że wszystkie wymagania dotyczące pamięci dynamicznej są spełnione przy użyciu pamięci sterty, więc funkcja malloc() również przydziela pamięć na stercie i zwraca do niej wskaźnik. Pamięć sterty jest bardzo ograniczona, dlatego gdy nasz kod rozpoczyna wykonywanie, zaznacza pamięć w użyciu, a gdy nasz kod kończy swoje zadanie, zwalnia pamięć za pomocą funkcji free(). Jeśli nie ma wystarczającej ilości pamięci i nasz kod próbuje uzyskać do niej dostęp, wówczas funkcja malloc() zwraca wskaźnik NULL. Pamięć przydzieloną przez funkcję malloc() można zwolnić za pomocą funkcji free().

Rozumiemy na przykładzie.

statyczne słowo kluczowe w Javie
 #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++)>

W powyższym kodzie wywołujemy funkcję func(). Funkcja func() zwraca wskaźnik będący liczbą całkowitą. Wewnątrz funkcji func() zadeklarowaliśmy wskaźnik *p, a pamięć jest przydzielana tej zmiennej wskaźnikowej za pomocą funkcji malloc(). W tym przypadku zwracamy wskaźnik, którego pamięć jest już zwolniona. ptr jest wiszącym wskaźnikiem wskazującym zwolnioną lokalizację pamięci. Można też powiedzieć, że ptr odnosi się do tej pamięci, na którą nie wskazuje wskaźnik.

Do tej pory poznaliśmy nowy operator i funkcję malloc(). Teraz zobaczymy różnice pomiędzy operatorem new a funkcją malloc().

Różnice między malloc() i new

malloc() vs nowy w C++
  • Operator new konstruuje obiekt, tzn. wywołuje konstruktor w celu zainicjowania obiektu while malloc() funkcja nie wywołuje konstruktora. Operator new wywołuje konstruktor, a operator usuwania wywołuje destruktor w celu zniszczenia obiektu. To jest największa różnica pomiędzy malloc() i new.
  • New jest operatorem, natomiast malloc() jest predefiniowaną funkcją w pliku nagłówkowym stdlib.
  • Operator new może zostać przeciążony, natomiast funkcji malloc() nie można przeciążyć.
  • Jeśli na stercie nie ma wystarczającej ilości pamięci, operator new zgłosi wyjątek, podczas gdy funkcja malloc() zwróci wskaźnik NULL.
  • W operatorze new musimy określić liczbę przydzielanych obiektów, natomiast w funkcji malloc() musimy określić liczbę przydzielanych bajtów.
  • W przypadku nowego operatora musimy użyć operatora usuwania, aby zwolnić pamięć. Ale w przypadku funkcji malloc() musimy użyć funkcji free(), aby zwolnić pamięć.

Składnia nowego operatora

 type reference_variable = new type name; 

Gdzie,

typ: Definiuje typ danych zmiennej referencyjnej.

zmienna_odniesienia: Jest to nazwa zmiennej wskaźnikowej.

nowy: Jest to operator służący do alokacji pamięci.

Wpisz imię: Może to być dowolny podstawowy typ danych.

Na przykład,

 int *p; p = new int; 

W powyższych instrukcjach deklarujemy zmienną wskaźnikową w postaci liczby całkowitej. Twierdzenie p = nowy int; przydziela miejsce w pamięci dla zmiennej całkowitej.

Składnia malloc() jest podana poniżej:

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

pt: Jest to zmienna wskaźnikowa.

Domyślne parametry Javy

typ danych: Może to być dowolny podstawowy typ danych.

Na przykład,

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

Powyższa instrukcja przydzieli pamięć dla zmiennej całkowitej na stercie, a następnie zapisze adres zarezerwowanej pamięci w zmiennej „p”.

  • Z drugiej strony pamięć przydzieloną za pomocą funkcji malloc() można zwolnić za pomocą funkcji free().
  • Po przydzieleniu pamięci za pomocą operatora new nie można zmienić jej rozmiaru. Z drugiej strony pamięć jest przydzielana za pomocą funkcji malloc(); następnie można go ponownie przydzielić za pomocą funkcji realloc().
  • Czas wykonania new jest krótszy niż funkcja malloc(), ponieważ new jest konstrukcją, a malloc jest funkcją.
  • Nowy operator nie zwraca oddzielnej zmiennej wskaźnikowej; zwraca adres nowo utworzonego obiektu. Z drugiej strony funkcja malloc() zwraca wskaźnik void, który można dalej rzutować na określony typ.