logo

маллоц() у односу на ново у Ц++

Оба маллоц() и нови у Ц++ се користе у исту сврху. Користе се за доделу меморије у току рада. Али маллоц() и нев имају различиту синтаксу. Главна разлика између маллоц() и нев је у томе што је нев оператор док је маллоц() стандардна библиотечка функција која је унапред дефинисана у стдлиб датотека заглавља.

Шта је ново?

Ново је оператор алокације меморије, који се користи за доделу меморије у време извођења. Меморија коју је покренуо нови оператор се додељује у хрпи. Враћа почетну адресу меморије, која се додељује променљивој. Функционалност новог оператора у Ц++ је слична функцији маллоц(), која је коришћена у Ц програмски језик . Ц++ такође је компатибилан са функцијом маллоц(), али се нови оператор углавном користи због својих предности.

Синтакса новог оператора

 type variable = new type(parameter_list); 

У горњој синтакси

тип: Дефинише тип података променљиве за коју нови оператор додељује меморију.

променљива: То је име променљиве која указује на меморију.

листа_параметара: То је листа вредности које су иницијализоване променљивом.

Оператор нев не користи оператор сизеоф() за доделу меморије. Такође не користи промену величине пошто оператор нев додељује довољно меморије за објекат. То је конструкција која позива конструктор у време декларације да би иницијализовао објекат.

Као што знамо да нови оператор додељује меморију у гомилу; ако меморија није доступна у хрпи и нови оператор покушава да додели меморију, онда се баца изузетак. Ако наш код није у стању да обради изузетак, онда ће програм бити ненормално прекинут.

Хајде да разумемо нови оператор кроз пример.

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

где,

тип: то је тип података променљиве за коју се меморија мора доделити.

име_променљиве: Дефинише име променљиве која указује на меморију.

(тип*): Користи се за примену типова тако да можемо добити показивач одређеног типа који указује на меморију.

једнако метод јава

величина(): Оператор сизеоф() се користи у функцији маллоц() за добијање величине меморије потребне за доделу.

Напомена: Функција маллоц() враћа показивач воид, тако да је потребно пребацивање типа да би се показивачу доделио други тип. Оператор сизеоф() је неопходан у функцији маллоц() пошто функција маллоц() враћа сирову меморију, тако да ће оператор сизеоф() рећи функцији маллоц() колико је меморије потребно за доделу.

Ако довољно меморије није доступно, тада се величина меморије може променити помоћу функције реаллоц(). Као што знамо да су сви захтеви за динамичку меморију испуњени коришћењем хеап меморије, тако функција маллоц() такође додељује меморију у хрпу и враћа показивач на њу. Хеап меморија је веома ограничена, тако да када наш код почне да се извршава, он означава меморију у употреби, а када наш код заврши свој задатак, онда ослобађа меморију коришћењем функције фрее(). Ако довољно меморије није доступно, а наш код покуша да приступи меморији, онда функција маллоц() враћа НУЛЛ показивач. Меморија која је додељена функцијом маллоц() може се ослободити коришћењем функције фрее().

Хајде да разумемо кроз пример.

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

У горњем коду позивамо функцију фунц(). Функција фунц() враћа целобројни показивач. Унутар функције фунц() декларисали смо показивач *п, а меморија се додељује овој променљивој показивача помоћу функције маллоц(). У овом случају враћамо показивач чија је меморија већ ослобођена. Птр је висећи показивач јер показује на ослобођену меморијску локацију. Или можемо рећи да се птр односи на ону меморију на коју показивач не указује.

До сада смо се упознали са новим оператором и функцијом маллоц(). Сада ћемо видети разлике између новог оператора и функције маллоц().

Разлике између маллоц() и нев

маллоц() у односу на ново у Ц++
  • Оператор нев конструише објекат, тј. позива конструктор да иницијализује објекат вхиле маллоц() функција не позива конструктор. Оператор нев позива конструктор, а оператор делете позива деструктор да уништи објекат. Ово је највећа разлика између маллоц() и нев.
  • Ново је оператор, док је маллоц() унапред дефинисана функција у датотеци заглавља стдлиб.
  • Оператор нев може бити преоптерећен док функција маллоц() не може бити преоптерећена.
  • Ако довољно меморије није доступно у хрпи, онда ће нови оператор избацити изузетак док функција маллоц() враћа НУЛЛ показивач.
  • У новом оператору морамо да наведемо број објеката који ће бити додељени, док у функцији маллоц() треба да наведемо број бајтова који ће бити додељени.
  • У случају новог оператора, морамо да користимо оператор делете да ослободимо меморију. Али у случају функције маллоц(), морамо да користимо функцију фрее() да ослободимо меморију.

Синтакса новог оператора

 type reference_variable = new type name; 

где,

тип: Дефинише тип података референтне променљиве.

референтна_променљива: То је име променљиве показивача.

Нова: То је оператор који се користи за доделу меморије.

укуцајте име: То може бити било који основни тип података.

мискл креирање корисника

На пример,

 int *p; p = new int; 

У горњим изјавама, ми декларишемо целобројну променљиву показивача. Изјава п = нови инт; додељује меморијски простор за целобројну променљиву.

Синтакса маллоц() је дата у наставку:

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

птр: То је променљива показивача.

тип података: То може бити било који основни тип података.

На пример,

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

Горња изјава ће доделити меморију за целобројну променљиву у хрпи, а затим ће сачувати адресу резервисане меморије у променљивој 'п'.

  • С друге стране, меморија додељена помоћу функције маллоц() може се ослободити помоћу функције фрее().
  • Када се меморија додели помоћу новог оператора, тада јој се не може променити величина. С друге стране, меморија се додељује помоћу функције маллоц(); онда се може поново доделити помоћу функције реаллоц().
  • Време извршења нове је краће од функције маллоц(), јер је нев конструкција, а маллоц функција.
  • Оператор нев не враћа посебну променљиву показивача; враћа адресу новокреираног објекта. Са друге стране, функција маллоц() враћа показивач воид који се може даље куцати у одређеном типу.