تحرير الذاكرة :
كما تعلـمنا فإنك حينمـا تقـوم بإنشـاء مؤشـر وحجـز مكــان لـه فـي الـذاكرة ،
مالذي سيحدث لهـذا المؤشـر .. الـذي سـيحدث لهـذا المؤشـر أنــه سيبقــى
موجوداً ولن يلغـى من مكـانه حتى تقوم أنت بإلغـائـه .. فكما قلنـا سـابقاً أن
المؤشرات تمنحـك الحريــة المطلقــة للتعامـل مـع الـذاكرة سـواء مـن ناحيـة
التخزين أو الإلفـاء ؛ ولكن لهذه الميزة ثمنها وصدقـني أن الثمن باهـظ للغــاية
... عـموماً حتى تقوم بإلغاء أي مؤشر مـن مكـانــه؛ فبإمكــانك كتــابة الكلمـة
الدليليــة delete قبــل اســم المؤشــر المـراد حذفـــه أو حتــى المرجعيـــة مــع
مراعاة عـدم كتابة معامل المؤشر أو المرجعيـة ..... مثلاً لنفـرض أنـك أنشـأت
مصفـوفـة مؤشرات هـكذا: float *number [100] [100];
كمــا تلاحــظ تحتـــوي هــذه المصفوفـــة علــى أكثــر مــن عشــرة آلاف عـــنصر
يستخـدمون 40 ألف بايت من الذاكرة وهـو رقم ضخـم جداً بالتالي فإن عليـك
حذف هذه المصفوفـة فور الانتهاء منها لتحرير الذاكرة من هـذا العـبء الثقيـل
جداً.
سنقوم الآن بدراسة هذا المثال:
1 #include <iostream.h>
2 main ( )
3 {
4 int *pPointer= new int;
5 *pPointer = 4;
6 delete pPointer;
7 return 0;
8 }
قد تتساءل عـن الفائدة المرجـوة من تحرير الذاكرة حالياً ؛ لكن تذكر هذا الأمـر
جيداً حاول دائماً أن تلغـي الذاكرة بعـد الانتهاء منها ؛ ولا تلعـب بهـذا الأمـر ؛ لا
تطلب من البرنامج طباعـة المؤشر في المثال السـابق بعــد تحريـر الـذاكرة..
صحيح أنه سيطلب العـدد المطلـوب ؛ لكـن الأمـر كـارثي حينمـا تتعــامل مـع
المشـروعات الضخمــة أو المتوسطــة ... وحينمـا أقـول أنـه خطيـر فـذلك لأن
المترجم لا يكشـف عــن هـذا النــوع مـن الأخطـاء .. المتـرجم لا يكشـف عــن
تسرب الـذاكرة أو عــن قيامـك بعــمليات علـى مؤشـر تـم حذفــه .. كـل هـذه
الأخطاء ستظهر عـند تنفيذ البرنامج وهـو لـيس أمـراً حسـناً كمـا تعلــم ؛ فلـن
تدري أين هـو الخطأ.
كما تعلـمنا فإنك حينمـا تقـوم بإنشـاء مؤشـر وحجـز مكــان لـه فـي الـذاكرة ،
مالذي سيحدث لهـذا المؤشـر .. الـذي سـيحدث لهـذا المؤشـر أنــه سيبقــى
موجوداً ولن يلغـى من مكـانه حتى تقوم أنت بإلغـائـه .. فكما قلنـا سـابقاً أن
المؤشرات تمنحـك الحريــة المطلقــة للتعامـل مـع الـذاكرة سـواء مـن ناحيـة
التخزين أو الإلفـاء ؛ ولكن لهذه الميزة ثمنها وصدقـني أن الثمن باهـظ للغــاية
... عـموماً حتى تقوم بإلغاء أي مؤشر مـن مكـانــه؛ فبإمكــانك كتــابة الكلمـة
الدليليــة delete قبــل اســم المؤشــر المـراد حذفـــه أو حتــى المرجعيـــة مــع
مراعاة عـدم كتابة معامل المؤشر أو المرجعيـة ..... مثلاً لنفـرض أنـك أنشـأت
مصفـوفـة مؤشرات هـكذا: float *number [100] [100];
كمــا تلاحــظ تحتـــوي هــذه المصفوفـــة علــى أكثــر مــن عشــرة آلاف عـــنصر
يستخـدمون 40 ألف بايت من الذاكرة وهـو رقم ضخـم جداً بالتالي فإن عليـك
حذف هذه المصفوفـة فور الانتهاء منها لتحرير الذاكرة من هـذا العـبء الثقيـل
جداً.
سنقوم الآن بدراسة هذا المثال:
1 #include <iostream.h>
2 main ( )
3 {
4 int *pPointer= new int;
5 *pPointer = 4;
6 delete pPointer;
7 return 0;
8 }
قد تتساءل عـن الفائدة المرجـوة من تحرير الذاكرة حالياً ؛ لكن تذكر هذا الأمـر
جيداً حاول دائماً أن تلغـي الذاكرة بعـد الانتهاء منها ؛ ولا تلعـب بهـذا الأمـر ؛ لا
تطلب من البرنامج طباعـة المؤشر في المثال السـابق بعــد تحريـر الـذاكرة..
صحيح أنه سيطلب العـدد المطلـوب ؛ لكـن الأمـر كـارثي حينمـا تتعــامل مـع
المشـروعات الضخمــة أو المتوسطــة ... وحينمـا أقـول أنـه خطيـر فـذلك لأن
المترجم لا يكشـف عــن هـذا النــوع مـن الأخطـاء .. المتـرجم لا يكشـف عــن
تسرب الـذاكرة أو عــن قيامـك بعــمليات علـى مؤشـر تـم حذفــه .. كـل هـذه
الأخطاء ستظهر عـند تنفيذ البرنامج وهـو لـيس أمـراً حسـناً كمـا تعلــم ؛ فلـن
تدري أين هـو الخطأ.
ليست هناك تعليقات:
إرسال تعليق