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

المؤشرات في ++c, هل تعرف ماذا سيحصل ؟(delete[] vs delete)

مغلق
بدأه Khaled.Alshaya في 1 يناير 2008 · 12 رد · 2,782 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عندما يبدأ أي شخص في تعلم ++C فإن المتعة لا تبدأ حتى يصل الشخص إلى مرحلة التعامل مع المؤشرات :D

السبب بسيط جداً, و هو أن ++C, تترك الحرية للمبرمج للتعامل مع الذاكرة يدوياً, الآن تصور أن لديك السطر التالي في برنامجك :

char* x = new char[2];

و قمت باستخدام الذاكرة المحجوزة بواسطة x في برنامجك, بعد ذلك بالطبع ستقوم بتحرير الذاكرة عن طريق السطر التالي :

delete[] x;

سؤالي هو التالي, ما الذي يحصل لو قمنا بكتابة السطر التالي بدلاً من ذلك :

delete x;

هل يمكنك معرفة مالذي سيحصل ؟؟

أنتظر مشاركتكم :)

#2

السلام عليكم

في البداية ظننت ان الكود الأول يحرر الذاكرة x وان الثاني يمسح عنوان الذاكرة x من المكدس (LOCALS) ....

لكن تحت المنقح لم ارى اي اختلاف :يتم في الحالتين ملئ الذاكرة بـ0xDD ولا يتم مسح المؤشر من المكدس , جربت ايضا استخدام x في دوال اخرى بعد المسح(بالطريقتين) ونجحو

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

أهلاً بك GamingMasteR ,,

اقتباس
في البداية ظننت ان الكود الأول يحرر الذاكرة x وان الثاني يمسح عنوان الذاكرة x من المكدس (LOCALS) ....

بالنسبة للذاكرة الديناميكية فإن طلب الحجز و التحرير يتم تمريره إلى نظام التشغيل و هي الذاكرة المحجوزة عن طريق المؤشرx في هذه الحالة, أما بالنسبة للمتغيرات على الـ Stack فإنها لا تحرر إلا بعد الخروج من المجال Scope الذي عرفت فيه تلك المتغيرات و هنا المؤشر x نفسه في هذه الحالة يكون على الـ Stack

اقتباس
لكن تحت المنقح لم ارى اي اختلاف :يتم في الحالتين ملئ الذاكرة بـ0xDD ولا يتم مسح المؤشر من المكدس , جربت ايضا استخدام x في دوال اخرى بعد المسح(بالطريقتين) ونجحو

هناك فرق و فرق قد يسبب استهلاك الذاكرة :D أنا قلت لكم أن التعامل الصحيح مع المؤشرات ليس بالهين :)

شكراً على مشاركتك ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 1 يناير 2008 في 04:55

#4

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

اقتباس
ما الذي يحصل لو قمنا بكتابة السطر التالي بدلاً من ذلك

أستاذي:

أتوقع فقط سيحذف العنصر الأول...

العنصر الثاني سيبقى محجوز في الذاكرة....

لكن انفلت منا ولا نستطيع بعد ذلك حذفه....

دمتم في رعاية الله،،،،

موقع كلية الحاسب الآلي ونظم المعلومات.

WWW.UQUCS.COM

#5

أهلاً بأخينا العواجي ,,

اقتباس
أستاذي:

أتوقع فقط سيحذف العنصر الأول...

العنصر الثاني سيبقى محجوز في الذاكرة....

لكن انفلت منا ولا نستطيع بعد ذلك حذفه....

ما شاء الله, الإجابة صحيحة 100% , و انت الأستاذ يا أخي العواجي :D ,,

المشكلة هنا حتى أننا لو قمنا بحذف العنصر الأول سيبقى الثاني في الذاكرة محجوزاً لبرنامجنا في نظام التشغيل و لن نستطيع التحكم فيه بعد ذلك :S ,,

هذه المشكلة مخادعة لدرجة كبيرة, لأنه عند تحرير الذاكرة فلن تتغير القيم الموجودة فيها حتى يعطي نظام التشغيل المساحة لبرنامج آخر و بالتالي ليس من الضروري أن تتغير القيم بعد أن نحرر الذاكرة!

تحياتي لك أخي العواجي

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 1 يناير 2008 في 11:25

#6

الجواب هو حذف العنصر الاول فقط من المصفوفة الديناميكية ..

لان المؤشر يشير الى اول موقع فقط .. وعند حذف الموقع الاول لا يمكن الوصول بعد الى اي عنصر بعد العنصر الاول ..

شكرا اخ خالد على السؤال الجميل ,,

تحياتي العطرة ...

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#7

اخوى الفاضل اعتقد انه

الكود الاول يقوم بحذف القيمة وهى رقم 2

اما الكود الثانى فهو يقوم بحذف العنوان كامل ؟

انا ليست خبرتى كبيرة فى السى بلس بلس بل انا من المبتدئين فيها جدا ولم اصل للمؤشرات بعد الصراحة

ولكن قلت اضع جوابى يمكن يطلع صحيح :)

واشكرك استاذى الفاضل على السؤال الرائع :)

#8
اقتباس
الكود الاول يقوم بحذف القيمة وهى رقم 2

رقم 2 يدل على كمية وليس قيمة

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#9

شكرا لك على سؤالك الجميل...

و نحن بحاجه لمثل هذه الأسئلة..

سبقني الاخ عواجي بالإجابه...

و هي انه سيحذف العنصر الاول فقط لأنا لم نضع اقواس المصفوفة..

لكن لو كان المؤشر يؤشر على كائن في غير مصفوفه..فإنه سيحذف الكائن

بارك الله فيك

#10

لدي سؤال خارج الموضوع و هو مافائدة مؤشر لstruct

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

#11
اقتباس
رقم 2 يدل على كمية وليس قيمة

اعتذر عن هذا الخطأ

انا فعلا كنت اقصد انها كمية لانها عدد :)

#12

شكراً على المشاركة من الجميع,,

الأخ العواجي أتى بها أولاً :D و لكن لا مشكلة فالأسئلة قادمة بإذن الله ,,

تحياتي ,,

#13

ابتلقف شوي لكن فعلا احس اني استمتع يوم اللي درسنا المؤشرات لكن الى الان ماتعمقنا لكن متعتي وانا ادرسه تساوي متعتي ايام ماكنت ادرس كيمياء

يارب التأهل ياكريم

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

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