الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مالفرق بين الدالة malloc و المعامل new ؟

مغلق
بدأه abram في 14 مايو 2004 · 4 رد · 611 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

ما الفرق بين الدالة malloc الكلمة المفتاحية في سي++ new اللتان تختصان بالمؤشرات

وهل يمكن عمل دالة مثال هذه الدالة

وشكرا لكم

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 24 يونيو 2012 في 17:38 — السبب: تعديل العنوان

#2

السلام عليكم ,,

الفرق في طريقة الاستخدام فقط ,,

cout  <<  "1\r\n";
  Test*  t1  =  new  Test();
  t1->Hello();
  delete  t1;

  cout  <<  "2\r\n";
  Test*  t2  =  (Test*)  malloc(sizeof  Test);
  t2->Hello();
  free(t2);

هذا لحالة حجز مصفوفة لبعد واحد ,,

لبعدين ,,

int* i1 = new int;
delete i1;

int* i2 = (int*) malloc(sizeof(int));
free(i2);

//declaring native type array

char** c1 = new char*[10];
delete[] c1;

char** c2 = (char**) malloc(sizeof(char)*10);
free(c2);

وهلم جرا وحتى 100 بعد لو أردت :)

بالنسبة لطريقة البرمجة ,,

يمكنك نظام التشغيل windows من حجز المتغيرات بالمستوى الأدنى باستخدام البنية ,,

_CrtMemBlockHeader

وانشاء متغير منها لاحتواء ارجاع قيمة الدالة ,,

كالتالي ,,

pHead = (_CrtMemBlockHeader *)_heap_alloc_base(blockSize);

حيث head متغير من نوع البنية CrtMemBlockHeader ,, عرفته في الأصل ,,

المهم بعد ذلك عليك ب

pHead->pBlockHeaderNext = NULL;
            pHead->pBlockHeaderPrev = NULL;
            pHead->szFileName = NULL;
            pHead->nLine = IGNORE_LINE;
            pHead->nDataSize = nSize;
            pHead->nBlockUse = _IGNORE_BLOCK;
            pHead->lRequest = IGNORE_REQ;

لحجز الذاكرة وتوجد 5 أنواع من طرق حجز الذاكرة بالطبع كل هذا من الذاكرة التكويمية heap ,, لأننا نتعامل بحجز المؤشرات وليس من الذاكرة الستاتيكية ,,

عموما يمكنك أن تتعامل على مستوى أعلى قليلا باستخدام ,,

void * pvBlk;
 pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine);

التي يمكن أن تكون قيمها كالتالي :

_heap_alloc_dbg(100,_newmode,_NORMAL_BLOCK,NULL,0);

ويمكن أن تتعامل على مستوى أعلى من ذلك وتستدعي الدالة ,,

_nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);

بشكل مباشر بالطبع يجب مساوة المؤشر بقيمة الدالة ,,

أو أخيرا المستوى الأعلى على الاطلاق وهو ,,

malloc ,, أو new في السي ++

أرجو أن أكون قد افدتك ,, :)

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#3

أما الفروق العملية تتركز في ,,

1) malloc لاتستدعي المشيد كما يفعل ال new ,,

2) malloc لاتحوي آلية لمعالجة الأخطاء داخليا ,,

3) يجب أن تحدد حجم البايتات المراد حجزها حسب كل نوع متغير على حدة ,, يعمي عليك باجراء حسابات الحجم ,,

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

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#4

شكرا لك على هذا الرد

المعتبر

ولكن ما هو ال heap الذاكرة التكويمية وما الفرق بينها وبين الاستاتيكية

وكيف يمكن عمل دالة معاملها هو نوع من أنواع الببانات

أي ان تطلب (الدالة هي الفاعل) نوع من انواع البيانات لكي تعمل

عملها المطلوب مثل الدالة malloc

ما هو المشيد الذي تستدعيه new

وماذا يعني أن malloc لا تحتوي على آلية لتصحيح الأخطاء

وماذا يعني أن تكون معامل ال new بارة عبارة عن دالة

وما هو هذا المؤثر <-

وما هي الدالة المقابلة لكلمة delete في c ومن أين أحصل على هذه الدالة

_CrtMemBlockHeader

واشرح لي هذا الكود الذي كتبه أنت

وعذرا على التطويل في الاسئلة

وشكرا لك على تفاعلك معي

#5
اقتباس
ما هو المشيد الذي تستدعيه new

المشيد الخاص بالفئة التي نريد أن نحجز لها ,, وليس للأنواع الأساسية,,

اقتباس
وماذا يعني أن تكون معامل ال new بارة عبارة عن دالة

ماذا تقصد ؟

اقتباس
وما هو هذا المؤثر <-

لاستدعاء الاعضاء الدالية ,, والمتغيرات داخل الفئة ,,

اقتباس
وما هي الدالة المقابلة لكلمة delete في c

free()

اقتباس
ومن أين أحصل على هذه الدالة

_CrtMemBlockHeader

موجودة مع نظام التشغيل في احدى ملفات ال dll ,, ولم أبحث عنه لاستدعاء الدالة بشكل ديناميكي ,, لكن يكفي للضمان أن تعرف الملف stdlib.h في الأعلى وسيعمل باذن الله ,,

اقتباس
ولكن ما هو ال heap الذاكرة التكويمية وما الفرق بينها وبين الاستاتيكية

راجع الرابط ,,

/index.php?showtopic=40999

اقتباس
وكيف يمكن عمل دالة معاملها هو نوع من أنواع الببانات

int MYFunc(int x,int y,double z)

اقتباس
واشرح لي هذا الكود الذي كتبه أنت

سأجيبك قريبا ,,

تم تعديل هذه المشاركة بواسطة HGB في 15 مايو 2004 في 00:25

banner_60_468.gif

NOTHING IS IMPOSSIBLE

هذا الموضوع مغلق.

مواضيع مشابهة