logo

malloc () مقابل الجديد في C++

كلا ال مالوك () والجديد في C++ يستخدم لنفس الغرض. يتم استخدامها لتخصيص الذاكرة في وقت التشغيل. لكن، malloc() و new لهما بناء جملة مختلف. الفرق الرئيسي بين malloc() والجديد هو أن الجديد هو عامل بينما malloc() هي وظيفة مكتبة قياسية محددة مسبقًا في com.stdlib الملف الاساسي.

ما الجديد؟

الجديد هو عامل تخصيص الذاكرة، والذي يستخدم لتخصيص الذاكرة في وقت التشغيل. يتم تخصيص الذاكرة التي تمت تهيئتها بواسطة المشغل الجديد في كومة. تقوم بإرجاع عنوان البداية للذاكرة، والذي يتم تعيينه للمتغير. وظيفة العامل الجديد في لغة C++ تشبه وظيفة malloc()، والتي تم استخدامها في لغة البرمجة سي . سي ++ وهو متوافق مع الدالة malloc() أيضًا، ولكن يتم استخدام المشغل الجديد في الغالب بسبب مزاياه.

بناء جملة المشغل الجديد

 type variable = new type(parameter_list); 

في بناء الجملة أعلاه

يكتب: فهو يحدد نوع بيانات المتغير الذي تم تخصيص الذاكرة له بواسطة المشغل الجديد.

عامل: وهو اسم المتغير الذي يشير إلى الذاكرة.

قائمة_المعلمات: إنها قائمة القيم التي تمت تهيئتها لمتغير.

لا يستخدم المشغل الجديد عامل التشغيل sizeof() لتخصيص الذاكرة. كما أنه لا يستخدم تغيير الحجم حيث يقوم عامل التشغيل الجديد بتخصيص ذاكرة كافية لكائن ما. إنها بنية تستدعي المُنشئ في وقت الإعلان لتهيئة كائن ما.

كما نعلم أن المشغل الجديد يخصص الذاكرة في كومة؛ إذا كانت الذاكرة غير متوفرة في الكومة وحاول المشغل الجديد تخصيص الذاكرة، فسيتم طرح الاستثناء. إذا لم يكن الكود الخاص بنا قادرًا على التعامل مع الاستثناء، فسيتم إنهاء البرنامج بشكل غير طبيعي.

دعونا نفهم المشغل الجديد من خلال مثال.

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

أين،

يكتب: إنه نوع بيانات المتغير الذي سيتم تخصيص الذاكرة له.

اسم المتغير: يحدد اسم المتغير الذي يشير إلى الذاكرة.

سلسلة الإرسال كـ int Java

(يكتب*): يتم استخدامه في الكتابة حتى نتمكن من الحصول على مؤشر من نوع محدد يشير إلى الذاكرة.

حجم(): يتم استخدام عامل التشغيل sizeof() في الدالة malloc() للحصول على حجم الذاكرة المطلوبة للتخصيص.

ملاحظة: تقوم الدالة malloc() بإرجاع المؤشر الفارغ، لذا فإن الكتابة مطلوبة لتعيين نوع مختلف للمؤشر. عامل التشغيل sizeof() مطلوب في وظيفة malloc() حيث تقوم وظيفة malloc() بإرجاع الذاكرة الأولية، لذلك سيخبر عامل sizeof() وظيفة malloc() مقدار الذاكرة المطلوبة للتخصيص.

إذا لم تكن الذاكرة الكافية متوفرة، فيمكن تغيير حجم الذاكرة باستخدام وظيفة realloc(). كما نعلم أن جميع متطلبات الذاكرة الديناميكية يتم استيفاؤها باستخدام ذاكرة الكومة، لذا تقوم الدالة malloc() أيضًا بتخصيص الذاكرة في الكومة وإرجاع المؤشر إليها. ذاكرة الكومة محدودة للغاية، لذلك عندما يبدأ تنفيذ التعليمات البرمجية الخاصة بنا، فإنه يحدد الذاكرة المستخدمة، وعندما يكمل الكود الخاص بنا مهمته، فإنه يحرر الذاكرة باستخدام وظيفة free(). إذا لم تكن الذاكرة الكافية متاحة، وحاول الكود الخاص بنا الوصول إلى الذاكرة، فإن الدالة malloc() ترجع المؤشر NULL. يمكن إلغاء تخصيص الذاكرة المخصصة بواسطة الدالة malloc() باستخدام الدالة free().

دعونا نفهم من خلال مثال.

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

في الكود أعلاه، نقوم باستدعاء الدالة func(). تقوم الدالة func() بإرجاع مؤشر العدد الصحيح. داخل وظيفة func()، قمنا بتعريف مؤشر *p، ويتم تخصيص الذاكرة لمتغير المؤشر هذا باستخدام وظيفة malloc(). في هذه الحالة، نقوم بإرجاع المؤشر الذي تم تحرير ذاكرته بالفعل. يعد ptr مؤشرًا متدليًا لأنه يشير إلى موقع الذاكرة التي تم تحريرها. أو يمكننا القول أن ptr يشير إلى تلك الذاكرة التي لا يشير إليها المؤشر.

حتى الآن، نتعرف على العامل الجديد والدالة malloc(). الآن، سوف نرى الاختلافات بين العامل الجديد والدالة malloc().

الاختلافات بين malloc() والجديدة

malloc() مقابل الجديد في C++
  • يقوم العامل الجديد بإنشاء كائن، أي أنه يستدعي المُنشئ لتهيئة كائن أثناء ذلك مالوك () الدالة لا تستدعي المنشئ. يقوم عامل التشغيل الجديد باستدعاء المنشئ، ويقوم عامل الحذف باستدعاء المدمر لتدمير الكائن. هذا هو الفرق الأكبر بين malloc() والجديد.
  • الجديد هو عامل التشغيل، في حين أن malloc() هي وظيفة محددة مسبقًا في ملف الرأس stdlib.
  • يمكن تحميل عامل التشغيل الجديد بشكل زائد بينما لا يمكن تحميل وظيفة malloc() بشكل زائد.
  • إذا لم تكن الذاكرة الكافية متوفرة في الكومة، فسيقوم المشغل الجديد بطرح استثناء بينما تقوم الدالة malloc() بإرجاع مؤشر NULL.
  • في المشغل الجديد، نحتاج إلى تحديد عدد الكائنات التي سيتم تخصيصها بينما في وظيفة malloc()، نحتاج إلى تحديد عدد البايتات التي سيتم تخصيصها.
  • في حالة وجود عامل جديد، يتعين علينا استخدام عامل الحذف لإلغاء تخصيص الذاكرة. ولكن في حالة الدالة malloc()، يتعين علينا استخدام الدالة free() لإلغاء تخصيص الذاكرة.

بناء جملة المشغل الجديد

 type reference_variable = new type name; 

أين،

يكتب: يحدد نوع بيانات المتغير المرجعي.

نوع فقاعة جافا

مرجع_متغير: إنه اسم متغير المؤشر.

جديد: إنه عامل يستخدم لتخصيص الذاكرة.

أكتب اسم: يمكن أن يكون أي نوع بيانات أساسي.

على سبيل المثال،

 int *p; p = new int; 

في العبارات المذكورة أعلاه، نعلن عن متغير مؤشر صحيح. البيان ع = كثافة العمليات الجديدة؛ يخصص مساحة الذاكرة لمتغير عدد صحيح.

بناء جملة malloc () موضح أدناه:

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

بتر: إنه متغير المؤشر.

نوع البيانات: يمكن أن يكون أي نوع بيانات أساسي.

على سبيل المثال،

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

ستخصص العبارة أعلاه الذاكرة لمتغير صحيح في الكومة، ثم تقوم بتخزين عنوان الذاكرة المحجوزة في المتغير 'p'.

  • من ناحية أخرى، يمكن إلغاء تخصيص الذاكرة المخصصة باستخدام الدالة malloc() باستخدام الدالة free().
  • بمجرد تخصيص الذاكرة باستخدام عامل التشغيل الجديد، لا يمكن تغيير حجمها. من ناحية أخرى، يتم تخصيص الذاكرة باستخدام وظيفة malloc ()؛ ومن ثم، يمكن إعادة تخصيصها باستخدام وظيفة realloc().
  • وقت تنفيذ new أقل من دالة malloc() لأن new عبارة عن بنية، و malloc عبارة عن دالة.
  • لا يقوم العامل الجديد بإرجاع متغير المؤشر المنفصل؛ تقوم بإرجاع عنوان الكائن الذي تم إنشاؤه حديثًا. من ناحية أخرى، تقوم الدالة malloc() بإرجاع المؤشر الفارغ الذي يمكن كتابته بشكل أكبر في نوع محدد.