Sultan_Althibity

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

12 ردود في هذا الموضوع

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

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

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

MyClass* pType = new MyClass;

وهذا الكود :

void* pType =  new MyClass

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

تم تعديل بواسطه usama707
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

همممممم

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .