سؤال

عند استخدام malloc ، إذا كان ينتج تفريغ الأساسية مع الخطأ:

malloc(): memory corruption: ....... ***

هل هذا يعني أن malloc حاول تخصيص الذاكرة التي كانت لا تتردد في تخصيص ؟ إذا فما هي أسباب ذلك ؟

هل كانت مفيدة؟

المحلول

وهذا يعتمد كليا على تنفيذ malloc الخاص بك، ولكن عادة ما هذا يعني أن في مرحلة ما قبل ذلك malloc شيء كتب مزيد من البيانات لمنطقة عازلة malloced من حجمها.

وهناك الكثير من متجر تطبيقات malloc بعض مضمنة بياناتهم مع ذاكرتهم، وبعبارة أخرى:

+--------------------------------+
|14 bytes -> Padding             | 
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+
|6 bytes -> Your data            |
+--------------------------------+
|8 bytes -> Padding              |
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+

وإذا كان الأمر كذلك كتب بعض رمز لك أو مكتبة 16 بايت إلى هذا المخزن 6 بايت فإنه الكتابة فوق الحشو و2 بايت من المعلومات malloc الداخلية. في المرة القادمة استدعاء malloc انها ستحاول على المشي من خلال البيانات الخاصة به لإيجاد مساحة، ضرب مساحة الكتابة، وسيكون لا معنى لها منذ كنت overwrote ذلك، إفساد الكومة.

واعتمادا على تنفيذ مثل هذا الخطأ قد يكون السبب أيضا بجعل مزدوج مجانا.

نصائح أخرى

وعلى الأرجح، وهذا ليس مشكلة في حد ذاته malloc. بدلا من ذلك، هذه مشكلة مع تطبيق تعديل لديك أجزاء من كومة أنه لا ينبغي.

إذا كنت تعمل على لينكس، حاول استخدام Valgrind لمعرفة أي الكود هو التحطيم كومة الخاص بك.

والسبب المعتاد لذلك هو أن كتبته على البيانات التي malloc () لا تعطيك الإذن للكتابة على - إما تجاوز سعة المخزن المؤقت (كتابة بعد انتهاء مساحة أعطيت أنت) أو تجاوز للعازلة (كتابة قبل بدء المخزن المؤقت).

ويمكن في بعض الأحيان أن يكون سبب وعتق المؤشر الذي لم يتم تخصيصها من قبل malloc () وآخرون، أو عن طريق تحرير إعادة (تحرير مزدوج) مؤشر التي تم تخصيصها من قبل malloc (). على سبيل المثال، وتحرير منطقة عازلة ثابت هو فكرة سيئة. ستحصل على الفساد.

ويجب أن نفترض أن المشكلة هي في التعليمات البرمجية - أنه من غير المرجح للغاية أن تكون مشكلة في malloc () وآخرون، ومن غير المرجح بدلا أن تكون في أي مكتبة أخرى كنت تستخدم

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

  • اجتياح تخصيص الذاكرة (الكتابة الماضي نهاية تخصيص كتلة)
  • مزدوجة تحرير كتلة
  • باستخدام المؤشر بعد انه تم الافراج
  • و بالطبع شيء كتابة خطأ من خلال مؤشر هذا لا علاقة له مع التخصيص السابق (a 'ram ضرب' أو المارقة المؤشر) - هذه هي الحالة العامة التي تشمل كل ما سبق.

هذه المشاكل يمكن أن يكون من الصعب التصحيح لأن السبب والنتيجة غالبا ما تكون مفصولة الزمان والمكان (منطقة مختلفة من التعليمات البرمجية).لذلك علة لا الحصول على لاحظت حتى الخلود (في وقت الكمبيوتر) يمر بعد الخلل الذي تسبب في المشكلة ينفذ.

استخدام كومة الذاكرة المؤقتة التصحيح يمكن أن تكون مفيدة جدا في تصحيح هذه القضايا.مايكروسوفت المجمعين لها CrtDebug كومة وهذا ما مكن في التصحيح يبني (ولكن يمكن أن يكون تكوين إضافي العناصر المحددة).لست متأكدا ما في دول مجلس التعاون الخليجي للخروج من مربع ، ولكن هناك أدوات أنا على دراية في تمرير مثل Valgrind و سياج كهربائي التي قد تساعد.أخيرا هناك الكثير من نابعة من كومة الذاكرة المؤقتة التصحيح المكتبات التي قد تكون مفيدة (Google).

هل يمكن أن يرجى تقديم malloc) بيانكم (؟

وأيضا، أردت أن يتضاعف تحقق من قيمة الإرجاع ليست فارغة؟

وخارج لعدم وجود ذاكرة لتخصيص لتبدأ، والمشاكل ولقد واجهت عند استخدام malloc() أو new مماثلة الطبيعة التي ذكرتها حيث الواقع الناتجة من كومة تالفة. وعادة ما وجدت بعض التعليمات البرمجية "مثيرة للاهتمام" في أي مكان آخر في البرنامج القيام soomething مثل memcpy () مع المخزن المؤقت حرف مما تسبب في تجاوز سعة المخزن المؤقت ومساحة عنوان المهترئ.

و-bn

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top