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

شغل مخك مع السي بلس بلس(void*=new)

مغلق
بدأه Sultan_Althibity في 22 فبراير 2006 · 11 رد · 1,771 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سؤال بسيط للغاية ...................

الذي يعرف حله فوراً فليقل أعرف أحله ولا يحله حتى نعطي فرصة التفكير لأعضاء المنتدى......

ما الفرق بين هذا الكـود:

MyClass* pType = new MyClass;

وهذا الكود :

void* pType =  new MyClass

حيث MyClass هـو عبارة عـن كلاس عادي ......

أيهما هـو الأفضل أثناء التعامل مع الذاكرة ؟ ولماذا ..........

#2

بصراحة أنا عن نفسي كل إللي أعرفه أنه يتم عمل compile-time type-checking لMyClass *PType عندما يتم إسناده لpointer أخر و لكن لا يتم عمل أي type-checking ل void *pType عند إسناده لpointer من أي نوع بالطبع

لذا فأن عن نفسي أظن أنه لا يوجد فرق و الله أعلم بالنسبة للتعامل مع الذاكرة و أن الCompiler يعطي نفس الكود في الحالتين ولكن بما أنك وضعت هذا السؤال فربما أنا مخطيء :Dعلى العموم لنرى رأي الأخوة

#3

السلام عليكم

اعتقد الموضوع له علاقة بالـdelete ولكنى لست متاكد.

بالنسبة للعنصر فلا يوجد فرق لان كمية الذاكرة التى يستخدمها لن تتغير سواً استخدمنا اسمه الاصلى او وضعنا void لان المتحكم فى حجز الذاكرة هو الدالة new.

ايضاً الحالة الاولى تستطيع التعامل معى المتغيرات التابعة للعنصر مباشرة ولكن فى الحالة الثانية يجب عليك ان تقوم بعمل type cast ..

طبعاً كل هذه تخمينات ولا اعرف مدى صحتها فانا خبرتى فى الoop ضعيفة وخاصة فى لغة السى بلس بلس..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#4

هذا بالظبط ما أقصده يا أخ أحمد

و أظن أن الكومبيلر يحجز في مكان ما معلومات حول حجم الobject الذي تم إنشائه حتى يستطيع الoperator delete تحريره من الذاكره و أنه في كلتا الحالتين ينتج نفس الكود سواء إستخدمت الطريقة الأولى أو الثانية

#5

السؤال من الأفضل .............. أو ربما من الأخطر ............ من منهـما أكثر كارثية من الأخرى في البرنامج ..... أو من منهما الأكثر فعالية للذاكرة ............... ولماذا؟

#6

بالطبع التعامل مع void* أخطر ويجب إستخدامه بحذر ولا يتم إستخدامه إلا في الأمور الlow-level مثل حجز الذاكره و تحريرها و ما إلى ذلك و يجب تجنبه عادة لأن التعامل معه خطر لأنه قد يستخدم بشكل خاطيء و عندها يؤدي إلى كوارث في ذاكرة البرنامج

#7

لم تحدد السبب الرئيسي ,,,,,,,,,,,,,,

====================================

لكي أكون أكثر تحديداً في السؤال ....

هل المؤشر الذي من النوع *void أخطر عـند التعامل معه في بقية أجزاء الكود أم الأخطر هـو *MyClass .... وما هـو مكمن الخطورة ... يعـني أخطر مصيبة ممكن تحصل في البرنامج لو استخدمت الطريقة الخطأ ولماذا؟

#8

عند إستخدام void* قد تحجز مثلا 8 بايت من الذاكره و تخطيء و تحوله إلى مؤشر لكائن أخر مثلا يحتجز 16 بايت من الذاكره و هنا تكون الكارثة عند تحريره مثلا لإنك ستتسبب في تحرير ذاكرة لايجب تحريرها و غالبا ما ستتسبب في عمل crash للبرنامج أو على الأقل ظهور memory leaks إذا فعلت العكس :D

تم تعديل هذه المشاركة بواسطة usama707 في 23 فبراير 2006 في 00:24

#9

همممممممممممم

قد يكون هذا أحد الأسباب ..... ولكن هذا النوع من الأخطاء لا يعتبر مستحيلاً أو صعباً .......... ولكن أنا أتحدث هـنا عـن الخطأ الذي لا يمكن الكشف عـنه تقريباً ............

قد يكون حلك هـو الصحيح ...... لكن الخطا الأكبر ليس في هذه الناحيـة .... المبرمج لن يكون غبياً حتى يجعل المؤشر void يشير إلى شيء آخر ... وحتى وإن جعله يشير إلى شيء آخر فسيضمن أصلاً أن هـناك مؤشر من النوع MyClass يشير إلى نفس المنطقـة من الذاكرة ..........

الخطأ الأكبر هـو أنه عـند طلب إلغاء الذاكرة بواسطـة الأمر delete فإن المؤشر ستحرر ذاكرتـه ولكن لن يستدعـى الهادم ............. فإن كان الكلاس يحوي مؤشرات أعضاء أخرى حجزت ذاكرة كبيرة لن يتم إلغاءها بواسطـة الهادم وهذا هـو أكبر خطأ أو أخفى خطأ

#10

همممممم

فعلا شيء لم أكن أعرفه ألف شكر يا أبو السلاطين على هذه المعلومه :D

#11

فاتنا أول سؤال...

بإنتظار سؤال آخر.. أجعلوها سلسلة كسلسلة هاني الاتاسي.

#12

السؤال كان رائع واكتسبت معلومه جديد شكرا لكم

وعندي سؤال ما الفرق بين السي بلس بلس والسي شارب وايهما افضل وهل c# امتداد ل c++؟

بصراحة لا املك اجابة واضحة عن هذا السؤال فاتمنى المساعدة

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

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